mod_rewrite表现得很奇怪

时间:2014-01-27 20:31:54

标签: apache .htaccess mod-rewrite rewrite

这是我的.httaccess文件。

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.mysite.com [NC]
RewriteRule ^(.*)$ mysite.com/$1 [L,R=301] << http: has been deleted to post this message.
RewriteBase /
RewriteRule ^gallery/([^/]*)$ /gallery.php?page=$1 [L,NC,QSA]
RewriteRule ^venues/([a-zA-Z0-9-/]+)/$ /venues.php?page=$1 [L,NC,QSA]

与以前创建的链接完美配合,

如果网址是:

mysite.com/gallery/my-old-link

模块将其重写为mysite.com/gallery.php?page=my-old-link

刚刚添加了一个新类别,没什么特别的,相同的字符 -

mysite.com/gallery/my-new-link

我期待模块将其重写为

mysite.com/gallery.php?page=my-new-link

但得到这个:

mysite.com/gallery/my-new-link/?page=my-new-link

包含403错误消息的页面:

  

禁止

     

您无权访问/ gallery / my-new-link /   服务器

     

此外,尝试时遇到404 Not Found错误   使用ErrorDocument来处理请求。

1 个答案:

答案 0 :(得分:0)

由于/gallery/my-new-link处有一个目录,因此目录由mod_dir处理,因为它缺少尾部斜杠。 mod_dir将尝试做的是将缺少尾部斜杠的目录的请求重定向到同一请求,而使用结尾斜杠。此重定向发生在mod_rewrite重写URI的同时,并且两者都应用于同一请求,从而导致重定向不稳定。

这意味着您需要关闭mod_dir,但这有点不好:

DirectorySlash文档说:

  

关闭尾部斜杠重定向可能会导致信息泄露。考虑一下mod_autoindex处于活动状态(Options + Indexes)并且DirectoryIndex设置为有效资源(例如index.html)的情况,并且没有为该URL定义其他特殊处理程序。在这种情况下,带有斜杠的请求将显示index.html文件。但是没有尾随斜杠的请求将列出目录内容。

因此,您还需要关闭 off mod_dir,同时还尝试通过将缺少尾部斜杠的目录请求重定向到同一请求并使用尾随来执行mod_dir所做的操作斜线:

DirectorySlash Off
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.mysite.com [NC]
RewriteRule ^(.*)$ mysite.com/$1 [L,R=301] << http: has been deleted to post this message.
RewriteBase /
RewriteRule ^gallery/([^/]*)$ /gallery.php?page=$1 [L,NC,QSA]
RewriteRule ^venues/([a-zA-Z0-9-/]+)/$ /venues.php?page=$1 [L,NC,QSA]

# redirect with trailing slash for directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R]