/file.php to /file/ try out


/file.php to /file/ try out

我想重定向/重写我的name.php文件到/name/我在另一个主题上找到了解决方案(http://stackoverflow.com/questions/5527789/htaccess-rewrite-within-directory-hide-php-extension-and-force-trailing-slash)

虽然,我想自己学习,从头开始。我首先使用了这个,它使eg .com/test/显示.com/test.php:

的内容。
 RewriteEngine On
 RewriteRule ^(.*)/$ $1.php

然后我尝试了以下操作,它将.com/test.php重定向到.com/test/:

 RewriteEngine On
 RewriteRule ^(.*)'.php$ http://www.mydomain.info/$1/ [R=301]

所以,两者都是独立工作的。但是当我把它们组合在一起的时候,我得到了一个循环错误,即使我把[L]加进去,这意味着规则只应该被使用一次。所以这行不通:

 RewriteEngine On
 RewriteRule ^(.*)/$ $1.php [L]
 RewriteRule ^(.*)'.php$ http://www.mydomain.info/$1/ [L,R=301]

我可能犯了一些愚蠢的错误,但对我来说似乎合乎逻辑……希望有人能指出我的错误。谢谢。

删除第一条规则中的l标志。这将停止"执行",并且不会使用第二个规则。在第二条规则中,您应该保留L标志,因为它是最后一个。

因为您有R=301的外部重定向,添加L并没有像您需要的那样有帮助,因为重定向将作为一个全新的请求返回到服务器-它再次匹配您的第一个重写规则。

相反,您需要这样做:

RewriteCond %{THE_REQUEST} ^'w+' /(.*)'.php' HTTP/
RewriteRule ^ /%1/ [R=301]
RewriteRule ^(.*)/$ $1.php

注意THE_REQUEST匹配原始请求的整行,例如GET /index.php HTTP/1.1。即使当%{REQUEST_URI}被重写为.php作为第二规则的一部分(它将匹配内部子请求),%{THE_REQUEST}永远不会被重写,这将确保重写为.php的URL不匹配子请求,并导致另一个重定向发送回客户端。