如何重写包含 %23 的 URL?

Posted

技术标签:

【中文标题】如何重写包含 %23 的 URL?【英文标题】:How to rewrite a URL with %23 in it? 【发布时间】:2011-01-27 04:00:04 【问题描述】:

我有一个(wordpress)博客,在用户发表评论后,用户会被重定向回页面,并带有一个指向他们评论的锚点。应该是这样的:

http://example.org/foo-bar/#comment-570630

但不知何故,我的日志文件中包含大量此类 URL 的 404:

http://example.org/foo-bar/%23comment-570630

有没有办法编写 .htaccess 重写规则来解决这个问题?

奖金问题: 知道为什么会发生这种情况以及我能做些什么吗?

【问题讨论】:

@Gumbo:使用 302 Found 重定向。生成的标题如下所示:“Location: /foo-bar/#comment-571738” 你能贴出这样的代码吗? @Gumbo:不是真的,因为它深埋在 Wordpress 核心中。在 99.99% 的情况下它也有效,而且它不是一个被广泛报道的 Wordpress 问题,所以我认为这是一个死胡同。 【参考方案1】:

%23# 的 URL 编码表示。我怀疑你的重写规则不会满足%23。您应该调查响应是如何构建的。具体来说,任何 URL 编码函数。

但是,可以使用重写规则来解决您的问题。了解您将在提交评论后向客户返回两个回复。这就是为什么最好更正第一个响应的原因。

# http://example.org/foo-bar/%23comment-570630 -> http://example.org/foo-bar/#comment-570630
RewriteCond %REQUEST_URI %23comment-\d+$
RewriteRule (.+)\/%23-comment(\d+)$ http://host/$1/#comment-$2 [R=301]

它未经测试,但应该可以工作(我不确定是否要转义 \%,因为它在 mod_rewrite 中具有特殊含义)。

【讨论】:

问题是我可以测试的所有系统上的响应都很好。它是 URL 中的 # 并且重定向有效,我不知道这会在哪里以及为什么会中断。 对你的重写规则:不起作用。 request_uri 的匹配好像不起作用,这也是我卡住的地方,也来这里问问。 RewriteCond 不满意?您是否尝试过转义百分比字符? 是的。我做的第一件事。我还尝试使用此在线测试器 civilolydnad.se/projects/rewriterule 改进 RewriteRule 并使其成为 (.+)\/\%23comment-(.+)$ http://host/$1/#comment-$2 [R=301],但这在我的服务器上也不起作用。很奇怪。【参考方案2】:

你试过B Flag吗?

RewriteCond %REQUEST_URI %23comment-\d+$
RewriteRule (.+)\/%23-comment(\d+)$ http://host/$1/#comment-$2 [B,R=301]

未经您的具体案例测试,但用于相关问题。

【讨论】:

这个答案是为那些在谷歌上搜索这个完全相同的问题的人准备的……为恢复这个封闭的旧线程而道歉

以上是关于如何重写包含 %23 的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据url的写入规则重写图片路径?

url重写后如何知道原始url?

是否可以在经典 asp 中进行友好的 url(url 重写)?

如何在 libre office 中设置 URL 编码的超链接?

如何使用 url 重写将位置数据存储在我的 asp.net 站点上所有页面的 url 中?

如何配置重写规则,即使在 URL 中使用别名,请求也会路由到服务器名称