【发布时间】:2015-04-17 20:55:38
【问题描述】:
我开始在我的日志中看到以下网址的 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
我错过了什么?
【问题讨论】:
-
RewriteRule "^(.+?\.html)\#" $1 [R=302,L]NE 表示没有转义的结果 url-string -
这条规则产生了
http://site.example.com/site/foo/bar.html。它确实从末端剥离了格式错误的锚点,但仍然导致 404。请注意由 RewriteBase 规则引起的额外“站点”。
标签: html apache .htaccess mod-rewrite