Nginx - 301 永久移动“问题”

Nginx - 301 永久移动“问题”

作为一个 Nginx 新手,我有一个无法解决的问题。在 Nginx 网站配置中,我有:

server {
       listen 443;
       listen [::]:443;

       ssl on;
       ssl_certificate /etc/letsencrypt/live/website.eu/fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live/website.eu/privkey.pem;

       server_name website.eu www.website.eu;
       index index.html index.htm index.php;
       root /var/www/website;

       location / {
                  try_files $uri $uri/ =404;
       }

       location /pihole {
                        alias /var/www/html;
                        try_files $uri $uri/ /admin/index.php?$query_string;
       }

       location ~ \.php$ {
                         include snippets/fastcgi-php.conf;
                         fastcgi_pass unix:/run/php/php7.2-fpm.sock;
       }
}

网站可以运行,但 Pihole 安装在/var/www/html文件夹中。如果我尝试访问它,我会得到:

  user@website:~$ curl -i https://www.website.eu/pihole
    HTTP/1.1 301 Moved Permanently
    Server: nginx/1.14.0 (Ubuntu)
    Date: Fri, 01 Nov 2019 11:29:13 GMT
    Content-Type: text/html
    Content-Length: 194
    Location: https://www.website.eu/pihole/
    Connection: keep-alive

知道哪里出了问题吗?

答案1

让我们检查:

  • 您当前的配置try_files指令:

    try_files $uri $uri/ /admin/index.php?$query_string;
    
  • index指示:

    index index.html index.htm index.php;
    
  • 您请求的 URL 路径是/pihole,它与 匹配location /pihole,而 的别名是:

    alias /var/www/html
    

好的,所以当您请求/pihole$uri)时,nginx将按顺序执行:

  • 首先检查$uri,但无法匹配,因为/pihole该位置已关联,因此无法匹配任何文件

  • 移至$uri/下一步(这会导致 301 重定向);因此在解析之后,alias最终的文件系统路径变为/var/www/website/,然后尝试查看index此目录中是否有任何由 引用的文件,因此在这里按顺序尝试index.htmlindex.htmindex.php—— 找到的第一个获胜并发送响应。

  • 如果第二步失败,则转到最后一步,即/admin/index.php?$query_string——这是绝对路径,因此它与服务器匹配root。因此最终路径变为:/var/www/website/admin/index.php?$query_string因为root设置为/var/www/website。如果找到文件/var/www/website/admin/index.php,则将其传递给query_string并发送结果响应。

  • 如果没有匹配项,最终会发送 404。

正如我之前提到的,在您的例子中,第二个 ( $uri/) 导致了您看到的 301 重定向。在此过程中,如果发生重定向,请务必检查指令Location以找出重定向的 URL:

Location: https://www.website.eu/pihole/ 

现在,使用时的一个好习惯location是使用尾随,/除非您进行通用/非绑定匹配。例如,location /pihole匹配/pihole/piholefoo等等/piholebar。但你可能不想要那样。所以在这种情况下你应该精确:

location /pihole/ {
    # Note trailing / here as well
    alias /var/www/html/;
    try_files $uri $uri/ /admin/index.php?$query_string;
}

相关内容