基本上,我想要“.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来找出它应该做什么。