【问题标题】:Trouble with simple htaccess RewriteRule to remove %23 from end of url使用简单的 htaccess RewriteRule 从 url 末尾删除 %23 的问题
【发布时间】: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


【解决方案1】:

您缺少“.html”前面的所有内容。试试这个重写:

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

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

【讨论】:

  • 因为我不允许在下面的 anubhavas 答案中添加评论,所以我在这里这样做.....@anubhava 提问者想要删除 %23 之后的所有内容,包括 %23。 .. 您的 Rewrite 会将 %23 之后的所有内容添加到替换中。所以你应该删除 $2。
  • 是的,这就是我认为应该可以正常工作的方法,并且在 RegEx101 中可以正常工作。但是当通过 htaccess 应用时,它会导致 http://site.example.com/foo/bar.html%23anchor: 原始错误链接。这条规则似乎没有任何效果。
【解决方案2】:

感谢您的所有建议,但没有一个解决了最初的问题。因为 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

【讨论】:

    【解决方案3】:

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

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

    %23\x23RewriteRule 中匹配。

    【讨论】:

    • 此规则导致 http://site.example.com/site/foo/bar.htmlanchor 和 404 错误。它正确删除了 %23 但保留了“锚”文本,并且还受到 RewriteBase 规则的影响并添加了额外的“站点”子目录。
    • 谢谢,这确实从末尾删除了锚字符串,但由于 RewriteBase 规则添加了一个子目录,仍然导致 404:http://site.example.com/SITE/foo/bar.html
    • 如果是这种情况,您可以在目标之前添加http://...,如更新后的答案所示。
    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多