麻烦简单的htaccess RewriteRule从url的末尾删除%23

时间:2015-04-17 20:55:39

标签: html apache .htaccess mod-rewrite

我开始在日志中看到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

我错过了什么?

3 个答案:

答案 0 :(得分:0)

你遗漏了“.html”前的所有内容。试试这个改写:

RewriteRule ^(.*\.html)(%23)(.*)$ $1 [R=302,NE,L]

https://regex101.com/r/fV3oU3/1

答案 1 :(得分:0)

用这个替换你的最后一条规则:

RewriteRule ^(.+?\.html)\x23 /$1 [R=302,NE,L,NC]

%23\x23RewriteRule的匹配。

答案 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