需要在 .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
而不是 #
,因为它也不起作用。
(%2
3 与 #
不匹配,因为它根本不是 == %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) 字符的主要内容,如果未能解决你的问题,请参考以下文章