Html 从url结尾删除%23的简单htaccess重写规则有问题

Html 从url结尾删除%23的简单htaccess重写规则有问题,html,apache,.htaccess,mod-rewrite,Html,Apache,.htaccess,Mod Rewrite,我开始在我的日志中看到404个URL错误,如: http://site.example.com/foo/bar.html%23anchor 很明显,锚被编码在其他人的电子邮件中,我无法控制,导致链接中断。锚链接并不重要,但我不希望我的用户看到404页。我原以为我可以通过简单的重写来解决这个问题,但我尝试过的方法都不管用,我看到的答案也都不管用 我尝试的重写代码在RegExr和regex101中工作得非常好,但是当我在.htaccess中尝试时,坏链接仍然会导致404错误。我有其他重写规则在工作

我开始在我的日志中看到404个URL错误,如:

http://site.example.com/foo/bar.html%23anchor
很明显,锚被编码在其他人的电子邮件中,我无法控制,导致链接中断。锚链接并不重要,但我不希望我的用户看到404页。我原以为我可以通过简单的重写来解决这个问题,但我尝试过的方法都不管用,我看到的答案也都不管用

我尝试的重写代码在RegExr和regex101中工作得非常好,但是当我在.htaccess中尝试时,坏链接仍然会导致404错误。我有其他重写规则在工作,但我似乎无法从请求末尾删除不需要的%23锚

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


我遗漏了什么?

您遗漏了.html前面的所有内容。尝试以下重写:

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

用以下内容替换上一条规则:

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

%23与重写规则中的\x23匹配。

感谢您的所有建议,但没有一个解决了最初的问题。因为RewriteBase规则会影响所有相关的重写,所以我无法找到一种按照我最初的意图编写此规则的方法。最后,唯一有效的办法似乎是重写到一条绝对路径。这是我最后的规则。它不灵活,仅适用于此页面,但至少它修复了我当前试图更正的特定断开链接:

重写规则^.*bar\.html\x23.*$http://site.example.com/foo/bar.html [R=302,东北,东北,北卡罗来纳州]

上述规则重写了以下内容:http://site.example.com/foo/bar.html%23anchor


为此:http://site.example.com/foo/bar.html

RewriteRule^.+?\.html\$1[R=302,L]NE表示没有此规则导致的转义结果url字符串http://site.example.com/site/foo/bar.html. 它确实将变形的锚从末端剥离,但仍然导致404。请注意RewriteBase规则导致的额外站点。因为我不允许在下面的anubhavas答案中添加评论,所以我在这里做@anubhava提问者想删掉%23之后的所有内容,包括%23。。。您的重写将把%23之后的所有内容添加到替换中。所以您应该删除$2。是的,这是我认为应该也可以使用的,它在RegEx101中也可以使用。但当通过htaccess应用时,会导致http://site.example.com/foo/bar.html%23anchor: 原来的坏链接。这条规则似乎没有任何效果。这条规则导致http://site.example.com/site/foo/bar.htmlanchor 还有一个404错误。它正确地删除了%23,但保留了锚文本,并且还受RewriteBase规则的影响,并添加了额外的站点子目录。谢谢,这确实从末尾删除了锚字符串,但由于RewriteBase规则添加了一个subdir,仍然导致404:http://site.example.com/SITE/foo/bar.htmlIf 这就是你可以添加的情况http://... 在目标之前,如更新的答案中所示。