/file.php到/ file /试用

时间:2012-01-01 03:07:04

标签: php redirect slash

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

虽然,我想自己学习并从头开始。 我第一次使用这个,例如.com / test / show .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]

我可能犯了一些愚蠢的错误,但对我来说似乎有道理...... 希望有人可以指出我的错误。 感谢。

2 个答案:

答案 0 :(得分:1)

由于您使用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}也永远不会被重写,这将确保URL重写为.php与子请求不匹配,导致另一个重定向被发送回客户端。

答案 1 :(得分:1)

从第一条规则中删除L-flag。这将停止“执行”,第二条规则将不会被使用。在第二条规则中,你应该保留L标志,因为它是最后一个。