需要在 .htaccess 重写规则中转义 # (hash/pound) 字符

Posted

技术标签:

【中文标题】需要在 .htaccess 重写规则中转义 # (hash/pound) 字符【英文标题】:need to escape # (hash/pound) character in .htaccess rewrite rule 【发布时间】:2011-04-04 20:13:25 【问题描述】:

这个问题相当简单,但我已经好几个小时找不到答案了。

我需要做的是:

RewriteRule ([^#])#(.*) $1\%23$2

这基本上意味着我想通过 url 转义来自外部代码片段的该死的井号。

反斜杠 (\) 无法转义此符号...请不要建议使用 %23 而不是 #,因为它也不起作用。

%23 与 # 不匹配,因为它根本不是 == %23

【问题讨论】:

【参考方案1】:

我刚刚在这个论坛上发表了几篇帖子后为一个网站工作,我正在使用重写规则,其中 NE 不转义和 R=301 重定向选项:

RewriteRule ^galleries/([a-zA-Z0-9_-]+)$ /gallery.html#/$1 [R=301,NE,L]

这会将所有 gallery/variable 重定向到 /gallery.html#/variable

编辑:规则的重要部分是 NE,它指示服务器解析输出而不转义字符。如果没有这个,它将尝试转义重写规则中的 # ,这是 OP 所要求的。

【讨论】:

请解释而不是仅仅举个例子 虽然这个答案包含有用的信息,但它似乎与建议的 OP 的问题有关。 OP 正在尝试匹配 RewriteRule pattern 中的 #,而上面的答案是在 RewriteRule substitution 中使用 #(片段标识符)。这是完全不同的。 @w3dk,OP 声明:“我想通过 url 转义该死的井号。”你用 NE 做这个。 @Dave 必须承认,回头看看这个问题,它似乎相当模棱两可......看起来 OP 都试图匹配请求中的#(哈希) 在响应中发回哈希。 NE(又名NOESCAPE)标志仅对后者有所帮助(尽管它不会转义任何东西-这是您在答案中正确陈述的内容)。 accepted 答案处理前者(请求中的哈希) - 如果哈希尚未在请求中进行 URL 编码,则它将成为显示停止器。【参考方案2】:

URL 的哈希部分不可用于重写。当 Web 浏览器向 Web 服务器发送 URL 请求时,它会将所有内容发送到哈希符号。哈希仅在客户端可用(例如 javascript 代码可以看到它)。

【讨论】:

这不是逃避#的方法,但显然在我的情况下这并不重要。所以我不会继续并将其设置为已接受。谢谢 虽然 # 之后的部分确实在请求 URL 中不可用,但您可以将其作为重定向 URL 的一部分。您只需要使用另一个答案中提到的 NE 选项来逃避它。 @PeterDolberg @Keith 问题是关于匹配模式中的#。另一个答案可能会帮助从 Google 找到这个问题的人,但它不是这个特定问题的有效答案。 NE 在这里不相关,我的回答不是“完全错误”。 约翰,你是对的。抱歉,我看错了问题;正如您所怀疑的那样,我正在寻找另一个答案中的信息。【参考方案3】:

在http://httpd.apache.org/docs/2.0/misc/rewriteguide.html 中搜索扩展重定向。您的问题有一个很好的解决方案。

【讨论】:

【参考方案4】:

.htaccess

RewriteRule  old\.php redirect.php?url=http://example.com/new.php|hash [R=301,QSA,L]

redirect.php

<?php
    $new_url = str_replace("|", "#", $_GET['url']);
    header("Location: ".$new_url, 301);
    die;
?>

【讨论】:

以上是关于需要在 .htaccess 重写规则中转义 # (hash/pound) 字符的主要内容,如果未能解决你的问题,请参考以下文章

复杂的 htaccess 重写规则 - 我从哪里开始?

PHP中查询字符串的HTACCESS重写规则

301 Htaccess 重写规则查询字符串

我可以编辑我的 .htaccess 来编写一些 WordPress URL(自定义重写)吗?

正则表达式在.htaccess中重写规则

需要帮助将 htaccess 规则转换为 nginx