【问题标题】:Add exception to nginx redirect https为 nginx 重定向 https 添加异常
【发布时间】:2025-12-09 00:00:02
【问题描述】:

我的 nginx 的 .conf 文件中有以下配置。我对配置 Web 服务器很陌生,所以我遇到了一些问题。现在,如果我理解正确,第一个块会将所有内容重定向到 https。第二个块是 example.com 的实际服务器配置,而第三个块将 www.example.com 重定向到没有 www 的第二个服务器块。标记。

现在有一个例外,我想在不使用 https 的情况下访问服务器上的文件夹。因此,如果我键入http://www.example.com/folder/page.php,则该站点不应重定向到 https,也不应重定向到没有 www 的普通 example.com。我尝试添加

location /folder/page.php
{
    http://www.example.com/folder/page.php
} 

到所有服务器块,但实际上它们都没有成功。

非常感谢有关如何解决此问题的任何建议。提前致谢!

server
{
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

server
{
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com;

    root /data/web/example.com/web;

    location /phpmyadmin
    {
        root /usr/share;
        location ~ \.php$
        {
            include php.conf;
        }

        location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ { 
            root /usr/share/; 
        } 
    }

    location /webftp
    {
        root /data/web;
        location ~ \.php$
        {
            include php.conf;
        }
    }
}

server
{
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

【问题讨论】:

    标签: http nginx redirect


    【解决方案1】:

    你试过了吗?这将进行完全匹配。为什么要不用https访问? 不是一个好习惯。

     server
      {
        listen 80;
        listen [::]:80;
        return 301 https://$host$request_uri;
    
        location=/folder/page.php
        {
          proxy_pass http://www.example.com/folder/page.php;
        } 
      }
    

    【讨论】:

    • 我尝试了您的建议,但在“example.com/folder/page.php”行出现“未知指令”错误,也许我应该在它前面添加一些内容?我知道这不是一个好习惯。但是,我们目前有一个客户端应用程序取决于服务器是 http 而不是 https 服务器,并且在我们可以更新客户端之前,我们想要升级服务器以便它可以在 https 上正常运行,所以最终这将是一个临时的解决方法.
    • 感谢您的帮助 shiva,我试过了,但结果是“重定向过多”错误。
    【解决方案2】:

    所以最后我终于想通了。我将以下内容添加到*服务器块:

    server
    {
        listen 80;
        listen [::]:80;
    
        location /folder/page.php {
             try_files $uri $uri/ =404;
             root /data/web/example.com/web;
             index index.php index.html index.htm default.html default.htm;
             include /etc/nginx/fastcgi_params;
    
             fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    
        location ~ \.dnl$ {
            root /data/web/example.com/web;
            try_files $uri $uri/ /index.php?$args;
        }
    
        location / {
            return 301 https://$host$request_uri;
        }
    }
    

    第一个块“location /folder/page.php”阻止重定向到 https 站点。但是因为我想在这里托管脚本,所以我需要添加相关代码,这样链接才能真正执行 php 脚本,而不仅仅是直接下载。

    然后我意识到我还在我的服务器上托管了 dnl 文件,我希望客户端能够下载这些文件。为了解决这个问题,我添加了第二个块“location ~ .dnl$”,这意味着每当请求以 .dnl 结尾时,将在给定文件夹中查找该文件,并将再次作为可下载内容提供给客户端没有 https。

    我希望这可以帮助其他有类似情况的人。

    【讨论】: