![nginx 重写规则,将 .php 结尾替换为 /](https://linux22.com/image/559372/nginx%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99%EF%BC%8C%E5%B0%86%20.php%20%E7%BB%93%E5%B0%BE%E6%9B%BF%E6%8D%A2%E4%B8%BA%20%2F.png)
基本上,我希望将“.php”替换为“/”。我尝试将规则放在 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
答案1
本质上,你的总体计划存在很多问题。首先,由于你要删除 .php,因此重写必须在 .php 之外,location ~ .php$
因为 URL 直到 .php 才会以 .php 结尾后它被重写。其次,你的rewrite
代码是倒着写的。你希望 URLhttp://www.example.com/foo/
运行foo.php
,因此重写需要
rewrite ^(.+)/ $1.php;
但这意味着您网站上的每个目录都需要一个匹配的 .php 文件,因为您将无法再自动使用 index.php。此外,如果 nginx 在重写之前没有对斜杠进行去重,如果有人将地址输入错误,那么http://www.example.com/foo//
它将执行/foo/.php
。
最后,您计划创建多少个 PHP 文件?您真的认为 serverfault 有一个 304162.php 文件用于这个问题吗?(并不是说 serverfault 的 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 而被拒绝。
看看人们如何设置干净的 URLDrupal或者WordPress 的。本质上,每个对不存在的文件的请求都被重写为/index.php?q=$1
,其中 index.php 查看“q”变量来确定它应该做什么。