带有-Indexes的.htaccess在给定目录时会进入无限重定向循环

时间:2012-09-04 20:08:44

标签: php apache .htaccess mod-rewrite

这是我的.htaccess文件:

# NO LISTING OF INDEXES
Options -Indexes

<IfModule mod_rewrite.c>
  RewriteEngine On

  # NIX THE www BECAUSE IT IS NO LONGER 1996 AND YOU'RE COOLER THAN THAT
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)/$ http://%1/$1 [R=301,L]

  # NIX TRAILING SLASHES BECAUSE SEO IS A VENGEFUL GOD AND WHATNOT
  RewriteRule ^(.*)/$ $1 [R=301,L]

  # SEND ALL NON-FILE REQUESTS TO index.php FOR FIGURING OUT
  RewriteBase /
  RewriteRule ^index\.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>

# ERROR DOCS
ErrorDocument 400 /error/400
ErrorDocument 401 /error/401
ErrorDocument 403 /error/403
ErrorDocument 404 /error/404
ErrorDocument 500 /error/500

如果我尝试访问文件夹(/images//images或我网站结构中的其他某个真实文件夹),则会进入重定向循环。

我尝试在尾部斜杠规则之前添加RewriteCond %{REQUEST_FILENAME} !-d,然后“修复”重定向,直到它现在在正确的文件夹上强制执行尾部斜杠 - 而且还将文件夹名称传递给我的脚本,就好像它一样是一个烘焙的URI查询,我的CMS要弄明白。

我想我现在可以通过检查URI是否是某个人试图非法列出的文件夹来尝试在CMS端修复此问题,但理想情况下会有一个优雅的.htaccess解决方案来重定向文件夹列表调用对于其中一个禁止的页面我非常有帮助地在那里宣布。有人知道吗?

2 个答案:

答案 0 :(得分:1)

不确定它是否有所作为,但我通常在任何条件规则之前从顶部开始

RewriteEngine On
Options +FollowSymlinks
RewriteBase /

您的重写基础会在稍后开始。也许就是这样。

答案 1 :(得分:1)

注释/删除此行:

RewriteRule ^(.*)/$ $1 [R=301,L]

您并不真正需要它,因为当有人试图列出您的目录内容时,您已经在顶部显示Options -Indexes以显示禁止的错误。除此之外,您可以在代码中进行一些小的调整:

# NO LISTING OF INDEXES
Options +FollowSymLinks -MultiViews -Indexes

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /

  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)/$ http://%1/$1 [R=301,L]

  # SEND ALL NON-FILE REQUESTS TO index.php FOR FIGURING OUT
  RewriteRule ^index\.php$ - [L,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^ index.php [L]
</IfModule>

# ERROR DOCS
ErrorDocument 400 /error/400
ErrorDocument 401 /error/401
ErrorDocument 403 /error/403
ErrorDocument 404 /error/404
ErrorDocument 500 /error/500