mod_rewrite删除.php扩展名并保留GET参数

时间:2013-04-26 06:54:53

标签: .htaccess mod-rewrite

我已经查看了这些解决方案,但实际上我们都没有正常工作:

mod_rewrite to remove .php but still serve the .php file?

How to remove file extension from website address?

How to use Apache Mod_rewrite to remove php extension, while preserving the GET parameters?

他们只是不做以下事情,这就是我需要做的事情:

1)从文件中删除.php扩展名,而不是/index.php显示/索引

2)保留GET参数(我在文件加载时读取并存储在会话cookie中,在标题中),所以代替/index.php?a=1&b=2显示可能/ index / a1 / B2

3)在子域名和https://上工作,而不会完全搞乱URL或以无限循环或其他方式结束......

有没有人知道如何整理这些规则,以便正确覆盖上述3点?

这就是我正在努力的起点:

RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1)
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]

3 个答案:

答案 0 :(得分:6)

你看到这是错误的方式。您不希望将.php文件的请求重定向到干净的地址,因为您从不希望用户首先看到.php。相反,您需要接受一个不以.php结尾的请求,然后检查该文件(在表面下)是否实际上具有.php扩展名。然后,如果是这种情况,请静默重写添加.php扩展名的请求,以便用户永远不需要查看扩展名。

尝试以下方法:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /$1.php [QSA]

一旦将“.php”添加到它的末尾,RewriteCond将检查请求(添加到DOCUMENT_ROOT路径的末尾)是否形成有效的文件名。如果是这样,则允许RewriteRule以静默方式重写请求,以便将“.php”添加到请求路径中。 QSA标志告诉mod_rewrite将现有查询字符串附加到新请求路径的末尾,因此应保留您的GET变量。

请注意,DOCUMENT_ROOT可能已经或可能没有尾随斜杠,因此您可能需要在RewriteCond中删除$1之前的斜杠。

对于查询字符串参数,mod_rewrite无法处理无限数量的变量,因此在mod_rewrite解决方案提供将其映射到查询字符串的方法之前,您需要在问题中提供显式请求模式。

答案 1 :(得分:3)

通过httpd.conf启用mod_rewrite和.htaccess,然后将此代码放在.htaccess目录下的DOCUMENT_ROOT中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

验证一切正常后,将R=302更改为R=301。 (在测试mod_rewrite规则时,避免使用R=301(Permanent)。

答案 2 :(得分:0)

尝试以下方法:

RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]