nginx 重写规则,将 .php 结尾替换为 /

nginx 重写规则,将 .php 结尾替换为 /

基本上,我希望将“.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”变量来确定它应该做什么。

相关内容