3

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

不过,我想自己学习它并从头开始。我第一次使用这个,它使例如 .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]

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

4

2 回答 2

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

于 2012-01-01T03:10:50.847 回答
1

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

于 2012-01-01T03:11:38.097 回答