.htaccess mod_rewrite删除.php扩展名,但保留URL路径

时间:2011-06-07 20:20:07

标签: linux apache .htaccess mod-rewrite

我目前有正常运行的PHP脚本,被调用如下: www.example.com/user.php/paul 和 www.example.com/tag.php/food

我无法正确地重写.htaccess。我试图实现这个目标: www.example.com/user/paul www.example.com/tag/food

到目前为止,我可以让它将/ user重定向到/user.php,但/ paul丢失了;打破我的剧本。

我目前的.htaccess看起来像这样:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^GET\ /([^.\ ]+\.)+php(\?[^\ ]*)?\ HTTP
RewriteRule ^(.+)\.php$ http://www.example.com/$1 [R=301,L]
RewriteRule ^([^/]+/)*index/?$ http://www.example.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ http://www.example.com/$1 [R=301,L]
RewriteCond $1 !^([^.]+\.)+([a-z0-9]+)$ [NC]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*[^/])$ /$1.php [L]

请帮忙。 谢谢! 保罗

2 个答案:

答案 0 :(得分:1)

你可能应该在某个地方使用这样的规则:

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

再次,用英语。

First comes the beginning of the path                        ^/
The first component of the path doesn't have / symbols in it [^/]*
We remember it                                               ()
Then comes the slash between the components                  /
Then the second component without the / symbols              [^/]*
Remember it too                                              ()
And the path ends                                            $

将其替换为第一个记住的内容,然后是.php/,然后是第二个记住的内容。

您可能不希望在此规则中使用[L],重定向不是必需的,用户无需知道您的脚本确实具有.php后缀。

希望这是正确的,我现在无法在正在运行的Apache上查看它。

答案 1 :(得分:0)

将此代码放入.htaccess文件中:

Options +FollowSymlinks -MultiViews
RewriteEngine on

# external redirect to hide .php
RewriteCond %{THE_REQUEST} ^GET\s.+\.php [NC]
RewriteRule ^([^/]+)\.php/(.*)$ /$1/$2 [NE,R=301,L,NC]

# internal redirect to add .php
RewriteRule ^([^/]+)(?<!\.php)/(.*)$ /$1.php/$2 [L]