.htaccess中的循环重定向

时间:2013-07-18 19:52:32

标签: .htaccess rewrite no-www trailing-slash

我有以下.htaccess文件:

AddDefaultCharset utf-8
RewriteEngine on
Options +SymLinksIfOwnerMatch
RewriteBase /

# redirect all www-requests to no-www
# -
RewriteCond %{HTTP_HOST} ^www\.site\.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]

# redirect all home pages to / (root)
# -
RewriteCond %{THE_REQUEST} ^.*/index\.(php|html?)
RewriteRule ^(.*)index\.(php|html?)$ /$1 [R=301,L] 

# remove trailing slash from dirs
# -
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /$1 [R=301,L]

# automatically add index.php when needed
# -
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|login\.php|reg\.php|robots\.txt|css/|js/)
RewriteRule ^(.*)$ /index.php [L]

.htaccess文件应该执行以下操作(对于SEO):

  1. 转换为无www(http://www.site.com应变为http://site.com
  2. 所有带尾随斜杠的URI都应转换为无尾随斜杠:http://site.com/me/应重定向http://site.com/me
  3. index.php/index.html的所有URI都应转换为空:http://site.com/admin/index.phphttp://site.com/admin/最终应显示为http://site.com
  4. 然而,当前版本的.htaccess在尝试访问时会导致循环重定向(http://site.com/admin)。应由浏览器提取的真实文档为http://site.com/admin/index.php

    有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

有一个名为 mod_dir 的模块会自动加载,它会导致对缺少尾部斜杠的目录的请求被重定向到一个尾部斜杠。您可以使用DirectorySlash指令将其关闭,但请在关闭时注意安全警告。如果您将其关闭并且默认索引不会加载,则会出现信息泄露安全问题。但是,你的拉特规则(看起来像)它会这样做,虽然不正确。

首先,关闭DirectorySlash

DirectorySlash Off

然后您需要将最后一条规则更改为:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index.php -f
RewriteRule ^(.*)$ /$1/index.php [L]