用nginx中的fastcgi重写url

我有一个工作在fastcgi config在nginx中。 现在我有很less的要求/X/X /X.php处理/Y.php /Y听起来很简单,所以我写了下面的testing:

rewrite ^/X.php$ /api/v1/stat last;

它被PHP应用程序的404处理程序捕获。 这里是rewrite_log的nginx错误日志

 [notice] 15289#0: *759 "^/X.php$" matches "/X.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com" [notice] 15289#0: *759 rewritten data: "/api/v1/stat", args: "", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com" [notice] 15289#0: *759 "^/X.php$" does not match "/index.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com" 

如果我直接访问/ api / v1 / stat,它可以工作:

 [notice] 15125#0: *708 "^/X.php$" does not match "/api/v1/stat", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com" [notice] 15125#0: *708 "^/X.php$" does not match "/index.php", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com" 

这里是我的相关nginxconfiguration:

 rewrite ^/X.php$ /api/v1/stat last; location / { try_files $uri $uri/ /index.php; } location ~ .*\.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass php; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } upstream php { server unix:/var/run/php-fpm.sock; } 

请帮我拿出一个解决scheme。 谢谢。

注意

一点点的背景可能会帮助你理解我的问题。

这可能很明显,以下应该工作,它会:

rewrite ^/X.php$ /api/v1/stat permanent;

但是,我正在处理某些不理解301redirect的硬件,所以我正在尝试使用内部redirect而不显示redirect。

更新1

我提出的解决scheme只有一半。 我得到/X.phpredirect到/api/v1/stat罚款。 但是,redirect后不能传递任何参数。 我认为rewrite将传递$args但它不工作。 我现在亏本了..

更新2

问题解决了。 虽然我还不确定为什么$args没有通过。

最后重写^ / X.php $ / api / v1 / stat; 发送给你“位置/”

例如,您可以使用其他位置来匹配此内部redirect:“/ api / v1 / stat”

在这个位置你可以传递请求到fcgi-backend(或者在这个位置修改它)。

打开nginxdebugging模式,比较工作请求和失败的日志之间的日志给了我一个线索:失败的请求的nginx REQUEST_URIvariables是/X.php ,甚至在重写后也没有得到更新。 看看nginx doc的variables

所以我需要在重写之后更新REQUEST_URI 。 这个post从这个帮助。

这是对我有用的东西:

 set $request_url $request_uri; if ($request_uri ~ ^/X.php(.*)$ ) { set $request_url /api/v1/x$1; rewrite ^/X.php /api/v1/x last; } location ~ .*\.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass php; fastcgi_index index.php; fastcgi_param REQUEST_URI $request_url; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } 

UPDATE

最后,这也适用于重写查询string。 我在if子句中添加了匹配的查询string,并将匹配的查询string附加到request_url 。 问题解决了。