用Nginx和PHP重写fastcgi仍然将旧的request_uri发送到后端(php和symfony)

时间:2011-12-01 09:40:28

标签: php symfony1 url-rewriting nginx fastcgi

我正在尝试将运行symfony框架的php网站迁移到nginx和php over fastcgi。

http://wiki.nginx.org/开始使用Symfony howto一切正常,但我遇到了自定义重写规则的问题。

我的目标是将 / aaaa 形式的网址重写为 / view / shorthand / aaaa 。然后应该通过php和symfony对请求进行处理。

旧的apache重写规则:

RewriteRule ^([0-9a-f]+)$ index.php/view/shorthand/$1 [L]

我试过的Nginx规则:

rewrite ^/([0-9a-f]+)$ /view/shorthand/$1 break;
rewrite ^/([0-9a-f]+)$ /index.php/view/shorthand/$1 break;

他们都被发送到fastcgi但 request_uri 似乎仍然是 / aaaa ,因为我收到此错误:

FastCGI sent in stderr: "Action "aaaa/index" does not exist" while reading response header from upstream

我也尝试过使用try_files而没有任何运气。请指教。

1 个答案:

答案 0 :(得分:12)

问题在于默认的FastCGI变量集(fastcgi_params配置文件),其中REQUEST_URI等于nginx的$request_uri。但是,如果您仔细阅读Nginx documentation,就会发现$request_uri$uri变量之间存在差异。

  • $request_uri =完整的原始请求URI(带参数)
  • $uri =请求中的当前URI,规范化

$uri的值可能会在请求处理期间发生变化,例如进行内部重定向时,或使用索引文件时。因此,如果您想在传递给PHP之前修复REQUEST_URI值,只需将$request_uri更改为$uri?$args中的fastcgi_params即可。

这是Nginx领导开发人员Igor Sysoev recommends in the official mailing list的方式。