2014-01-27 37 views
1

这是我的.httaccess文件。mod_rewrite行事怪异

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 /在此 服务器上。

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

+0

尝试评论你的第一个301规则,然后在新的浏览器中重新测试。 – anubhava

+0

是否有一个名为'/ gallery/my-new-link'的目录? –

+0

@anubhava那么它根本不起作用。 –

回答

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文件。但是没有斜杠的请求会列出目录内容。

所以你需要打开关闭 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] 
+0

谢谢你,我改变了一下后,你的工作在这里:RewriteRule^gallery /([a-zA-Z0-9 - /] +)$ /gallery.php?page=$1 [L,NC,QSA] –