我开始在日志中看到404错误,例如:
http://site.example.com/foo/bar.html%23anchor
显然#anchor正在被编码(可能在别人的电子邮件中,我无法控制)导致链接断开。锚链接并不重要,但我不希望我的用户看到404页面。我想我可以用一个简单的重写来解决这个问题,但是我没有尝试过任何工作,而且我看到的SO答案都没有。
我尝试过的重写代码在RegExr和regex101中完美运行,但是当我在.htaccess中尝试时,错误的链接仍会导致404错误。我有其他RewriteRules工作,但我似乎无法从请求的末尾删除不需要的%23anchor。
RewriteEngine on
RewriteBase /site
## Externally redirect non-canonical domain requests to canonical domain. ###
## This rule works ###
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://site.example.com/$1 [R=301,NC,L]
## This rule doesn't work ###
RewriteRule ^(\.html)(%23)(.*)$ $1 [R=302,NE,L]
我需要改变这个:
http://site.example.com/foo/bar.html%23anchor
进入:
http://site.example.com/foo/bar.html
我错过了什么?
答案 0 :(得分:0)
你遗漏了“.html”前的所有内容。试试这个改写:
RewriteRule ^(.*\.html)(%23)(.*)$ $1 [R=302,NE,L]
答案 1 :(得分:0)
用这个替换你的最后一条规则:
RewriteRule ^(.+?\.html)\x23 /$1 [R=302,NE,L,NC]
%23
是\x23
中RewriteRule
的匹配。
答案 2 :(得分:0)
感谢您提出的所有建议,但没有一个解决了最初的问题。因为 RewriteBase 规则会影响所有相对重写,所以我找不到按照我最初的意图编写此规则的方法。最后,似乎唯一有用的就是重写为绝对路径。这是我最终的规则。它不灵活,只适用于此页面,但至少它修复了我目前正在尝试更正的特定断开链接:
RewriteRule ^(.*bar\.html)\x23.*$ http://site.example.com/foo/bar.html [R=302,NE,L,NC]
上述规则重写了这一点:http://site.example.com/foo/bar.html%23anchor
:http://site.example.com/foo/bar.html