使用mod_rewrite RewriteRule重写所有查询以不需要.php扩展名

6

我希望您能为我翻译所有类似于以下查询的内容:

http://mysite.com/something/otherthing?foo=bar&x=y

需要重新撰写为

http://mysite.com/something/otherthing.php?foo=bar&x=y

换句话说,就是让.php扩展名成为可选项,普遍适用。
5个回答

6
我会这样做。如果文件不存在,尝试在文件名后面添加 .php 后缀。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ $1.php [QSA,L]

这就是我现在正在做的事情。非常好,谢谢! - dreeves
那么这意味着如果访问的资源不是文件或目录,它将执行RewriteRule吗? - bafromca

1

这个有效:

RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^/?([^/\.]+)$ /$1.php [L]

这个想法是确保有一个查询字符串(问号加上一些东西),如果有的话,检查问号前面的东西是否没有扩展名,如果是,则添加 .php。


1
如果您可以更改httpd.conf并知道如何更改,您也可以添加以下内容:
ForceType application/x-httpd-php

在文件中加入这段代码,它将强制所有调用的路径都是 PHP 文件。我认为这也适用于查询字符串。


0

类似于...

RewriteRule /something/(.+)?(.+) /something/$1.php?$2

可能会起作用。


你可能需要使用反斜杠转义问号。 - John Sheehan
我尝试过了。我认为查询字符串的内容不是RewriteRule匹配的一部分。您必须对查询字符串进行单独的RewriteCond操作。请参见我的答案。 - dreeves

0

仅匹配没有扩展名的路径:

RewriteRule ^(([^/]+/+)*[^\.]+)$ $1.php

编辑:在我的测试中,查询字符串会自动传递。如果没有,您可以使用以下方法:

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(([^/]+/+)*[^\.]+)$ $1.php?%1

[QSA, L] 传递查询字符串(L 表示在此规则后不再处理)。 - NateS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接