我有几个这样的网址:
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]
但没有运气。
我做错了什么?
答案 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了解详细信息。