Nginx 重写未按预期工作

Nginx 重写未按预期工作

我正在尝试学习如何使用 nginx 以及如何使用它的重写功能

Nginx 似乎正在进行重写:

2012/03/27 16:30:26 [notice] 16216#0: *3 "foo.php" matches "/foo.php", client: 61.90.22.223, server: localhost, request: "GET /foo.php HTTP/1.1", host: "domain.com"
2012/03/27 16:30:26 [notice] 16216#0: *3 rewritten data: "img.php", args: "", client: 61.90.22.223, server: localhost, request: "GET /foo.php HTTP/1.1", host: "domain.com"

但在我的访问日志中我得到了以下信息:

61.90.22.223 - - [27/Mar/2012:16:26:54 +0000] "GET /foo.php HTTP/1.1" 404 31 "-" "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
61.90.22.223 - - [27/Mar/2012:16:30:26 +0000] "GET /foo.php HTTP/1.1" 404 31 "-" "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"

根目录中有一个 img.php,所以我不确定为什么会出现 404 错误

以下是配置块的一部分:

rewrite foo.php img.php last;


location / {

        try_files $uri $uri/ /index.html;
}





location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
}


# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
        deny all;
}

答案1

您需要提供一个完整的路径(相对于文档根目录)作为目标:

rewrite foo.php /img.php last;

在 img.php 前添加斜线就足够了(在 Nginx 1.0.14/CentOS 6 上测试)。

Nginx 将采用其生成的路径,如果路径以 http:// 开头,则执行 301 或 302 重定向,否则将其附加到文档根目录。在后一种情况下,新路径需要以斜杠开头。

此外,如果您只想匹配文档根目录中的“foo.php”,您也应该在该参数前面加上斜杠(这样不仅更具体,而且匹配速度也更快):

rewrite ^/foo.php$ /img.php last;

相关内容