nginx重写规则来replace.php结尾符合/

基本上,我想要“.php”replace为“/”。 我试图把我的规则放在fastcgi所在的同一个位置。

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; rewrite ^(.+)\.php$ /$1; } 

但是,当我用这些设置重新启动nginx时,它给了我一个500内部服务器错误,我什至不能让服务器显示任何东西。 这是因为快速CGI? 我该如何解决这个问题?

我的系统:nginx / php5-fpm / apc / php5-memcache / Ubuntu 10.10

从本质上讲,你的总体计划有很多问题。 首先,由于您正在删除.php文件,所以重写必须在location ~ .php$以外,因为在重写之前,URL不会以.php结尾。 其次,你的rewrite是倒退的。 你希望URL http://www.example.com/foo/运行foo.php ,所以重写需要

 rewrite ^(.+)/ $1.php; 

但是这意味着你网站上的每一个目录都需要一个匹配的.php文件,因为你将不再能够自动使用index.php。 另外,如果nginx在重写之前不删除斜线,如果有人错误地址为http://www.example.com/foo//那么它将执行/foo/.php

最后,你打算创build多less个PHP文件? 你真的认为serverfault有这个问题的304162.php文件吗? (不是那个serverfaults的URL会匹配你的重写,因为它不会以/结束,我们也不会使用PHP)

通常情况下,干净的URL通过声明一个特定的位置(例如/questions/ )来工作,然后在该URL之后重写所有的内容以便由一个脚本运行:

 rewrite ^/questions/(.*)$ /questions.php?path=$1 last; 

你也可以做类似的事情

 rewrite ^/questions/([0-9]+)(/.*)?$ /questions.php?qid=$1&extra=$2 last; 

所以这些url可能是example.com/questions/1 example.com/questions/1/ example.com/questions/1/how-do-I-rewrite但是example.com/questions/banana会因为没有数字问题ID。

看看人们如何为Drupal或Wordpress设置干净的URL。 从本质上讲,每一个不存在的文件的请求被重写为/index.php?q=$1 ,其中index.php查看“q”variables来找出它应该做什么。