无法在 nginx 中找出位置块
Posted
技术标签:
【中文标题】无法在 nginx 中找出位置块【英文标题】:Can't get location blocks figured out in nginx 【发布时间】:2012-05-10 17:54:42 【问题描述】:很难在 nginx 配置中找出位置块。这就是我所拥有的:
server
listen 80;
server_name _;
access_log /var/log/nginx/example.com.access_log;
error_log /var/log/nginx/example.com.error_log warn;
root /var/www/root;
index index.php index.htm index.html;
fastcgi_index index.php;
location /wp/
root /var/www/wordpress;
index index.php index.htm index.html;
fastcgi_index index.php;
location ~* \.php$
try_files $uri =404;
keepalive_timeout 0;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
浏览到 / 按预期工作,并在 /var/www/root 中显示网站,但如果位置正常,我认为他们应该浏览到 /wp 应该将我带到 /var/www/wordpress 中的 wordpress 安装。我得到的只是:
404 未找到
nginx/0.7.67
如果我将 /var/www/wordpress 目录重新定位到 /var/www/root/wordpress 并浏览到 /wordpress,一切都完美了。
我对位置块做错了什么??
我以前从未配置过 nginx,反正我是一个完整的网络新手。
我也希望能够为其他应用程序提供更多位置块。这实际上只是在此处发布的一个基本示例。
将 nginx 更新为 Debian Squeeze backports 中的版本。没有改善:
404 未找到
nginx/1.1.19
【问题讨论】:
您是否尝试过转到 /wp/? 你不想想象 nginx/0.7.67 已经过时了。 我也试过 /wp/ 。这是来自 Debian 6 存储库的 nginx。我猜 Debian 确实有点落后。不过,我倾向于坚持使用 repos 中的内容。 您可以从 the backports repo 获得 Squeeze 的最新版本。 我会尝试更新并回帖。 【参考方案1】:它不起作用的原因是......
在服务器级别,您拥有“root /var/www/root”。所以基本上,除非特别覆盖,否则每个位置块都会使用它。这是一个很好的做法。
然后,您已在“wp”位置块中将其覆盖为“/var/www/wordpress”。但是,php location 块还是使用默认的。
现在,当您向物理上位于“/var/www/wordpress/folder_a/file_a.php”的“/wp/folder_a/file_a.php”发出请求时,请求会到达 php 位置块并给出该块的活动根文件夹会在“/var/www/root/folder_a/file_a.php”中查找文件。结果,您会得到“404 not found”。
您可以将服务器级别的根指令更改为“/var/www/wordpress”并删除 wp 位置中的覆盖。这将解决该问题,但“/var/www/root”下的 php 脚本将不再起作用。不知道你有没有。
如果你需要在“/var/www/root”和“/var/www/wordpress”下运行php,你需要这样做:
server
...
root /var/www/root;
index index.php index.htm index.html;
# Keep fastcgi directives together under location
# so removed fastcgi_index
# Put keepalive_timeout under 'http' section if possible
location /wp/
root /var/www/wordpress;
# One appearance of 'index' under server block is sufficient
location ~* \.php$
try_files $uri =404;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
location ~* \.php$
try_files $uri =404;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
即在 wp 位置块下嵌套一个重复的 php 位置块。它将继承 wp 的根指令。
为了帮助保持简洁和便于编辑等,您可以将 fastcgi 指令放入单独的文件中,并根据需要将其包含在内。
所以在 /path/fastcgi.params 中,你有:
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
你的 conf 可以是:
server
...
root /var/www/root;
...
location /wp/
root /var/www/wordpress;
location ~* \.php$
try_files $uri =404;
include /path/fastcgi.params;
location ~* \.php$
try_files $uri =404;
include /path/fastcgi.params;
这样,如果你需要编辑任何 fastcgi 参数,你只需在一个地方编辑它。
PS。更新你的 nginx 并不能解决这个问题,因为它不是版本问题.. 但无论如何都要更新!
【讨论】:
谢谢。我曾怀疑它使用了错误的 document_root,但不知道您可以像这样堆叠位置块!成功后我会回复。 有什么方法可以准确查看执行 php 脚本时 SCRIPT_FILENAME 的值是多少?location /wp/
需要为 location ^~ /wp/
以防止外部 php 位置覆盖它。见documentation
@kolbyjack 和 Dayo 如果你能解决这个问题,你会成为我的英雄:***.com/questions/23645386/… 谢谢!以上是关于无法在 nginx 中找出位置块的主要内容,如果未能解决你的问题,请参考以下文章