我想重定向/重写我的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不匹配子请求,并导致另一个重定向发送回客户端。