7

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

4

1 回答 1

7

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

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

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

现在,当您向物理上位于“/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 并不能解决这个问题,因为它不是版本问题.. 但无论如何都要更新!

于 2012-05-01T08:38:30.910 回答