.htaccess:重定向包含/../的URL

时间:2013-02-15 16:45:28

标签: regex .htaccess redirect

我有几个这样的网址:

http://site.com/knowndir/../somedir/page.html

我需要将它们重定向到

http://site.com/somedir/page.html

基本上,我需要从URL中删除knowndir/../粒子。我知道knowndir部分。

到目前为止,我已尝试过这条规则:

RewriteRule knowndir\/\.\.\/(.*)$ http://site.com/$1 [R=301,L]但没有运气。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

似乎客户端已经删除了...路径元素。当您使用firefox或wget请求具有telnet和access.log的URL时,您可以看到Apache GET /knowndir/../somedir/page.html HTTP/1.0中的差异。

尽管如此,Apache收到带有...路径元素的请求时,Apache已经自行处理了这个问题,而不需要任何重定向规则。这意味着它会删除.subdir/..来解析这些细分,以获得明确的路径。

因此,最后您的RewriteRule永远不会看到knowndir/../,因此不会发送301重定向。

<强>更新

我终于找到了相关的RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax,其中5.2.4. Remove Dot Segments描述了应该如何处理...

OT:永远不要在启用301的情况下进行测试,请参阅此回答Tips for debugging .htaccess rewrite rules了解详细信息。