无法在nginx中找到位置块

时间:2012-05-01 04:59:54

标签: configuration nginx

很难在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 Not Found

     

的nginx / 0.7.67

如果我将/ var / www / wordpress目录重新定位到/ var / www / root / wordpress并浏览到/ wordpress,那么一切都很完美。

我对位置块做错了什么?

我之前从未配置过nginx,无论如何都是一个完整的web newb。

我希望能够为其他应用程序提供更多的位置块。这只是在这里发布的基本示例。

在Debian Squeeze backports中将nginx更新为版本。没有改善:

  

404 Not Found

     

的nginx / 1.1.19

1 个答案:

答案 0 :(得分:7)

它不起作用的原因是......

在服务器级别,您有“root / var / www / root”。所以基本上,除非特别重写,否则每个位置块都将使用它。这是一种很好的做法。

然后,您已在“wp”位置块中将其覆盖为“/ var / www / wordpress”。但是,php位置块仍然使用默认值。

现在当你向“/ww/folder_a/file_a.php”提出请求时,请求命中了“位置块”并给出该块激活的根文件夹将在“/var/www/root/folder_a/file_a.php”中查找该文件。结果,您得到“未找到404”。

您可以将服务器级别root指令更改为“/ 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不会解决这个问题,因为它不是版本问题..但无论如何都要更新!