作为一个 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.html
、index.htm
、index.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;
}