使用 mod_rewrite 将带有哈希字符的路径转换为查询字符串

Posted

技术标签:

【中文标题】使用 mod_rewrite 将带有哈希字符的路径转换为查询字符串【英文标题】:Using mod_rewrite to convert paths with hash characters into query strings 【发布时间】:2011-06-25 00:50:24 【问题描述】:

我有一个 php 项目,我需要在 URL 的路径中发送一个哈希字符 (#)。 (http://www.example.com/parameter#23/parameter#67/index.php) 我认为 urlencode 会允许这样做,将哈希转换为 %23

但现在我看到,即使是 urlencoded 哈希也会迫使浏览器将右侧的所有内容视为 URL 片段(或查询)。

有没有办法传递哈希,或者我需要在 urlencode 之前进行字符替换?

编辑添加(2017 年 9 月 19 日):

原来我问错了问题。我的问题不在于在路径中使用哈希字符(编码它确实有效),而是使用 mod_rewrite 将其转换为查询字符串。我未能在 RewriteRule 中重新编码它。我将编辑标题以匹配。

这是我使用的重写规则:

RewriteEngine On
# convert path strings into query strings
RewriteRule "^(.*)/(.*)/hashtags.php"      /hashtags.php?parameter_1=$1&parameter_2=$2 [QSA,L]

只要我添加了 B 标签,它就可以正常工作:

RewriteEngine On
# convert path strings into query strings
RewriteRule "^(.*)/(.*)/hashtags.php"      /hashtags.php?parameter_1=$1&parameter_2=$2 [QSA,L,B]

【问题讨论】:

您以什么方式使用该网址? 我相信 urlencode 应该把它改成 %23,你能提供一个示例代码吗? 我正在为动态创建的 PDF 创建静态链接。我正在使用 modrewrite 将路径元素传递给 $_GET。它们是创建 PDF 所需的产品参数。一些产品的产品名称中有井号标签。 哈希是一个保留字符,无论如何网页浏览器都会这样对待它。是否对其进行编码并不重要,因为解释将是相同的。还有其他角色可以使用吗? Jeremy:是的,经过更多测试后,我意识到是浏览器在做这件事。如果我绕过浏览器并告诉 PHP 解释两个 URL(一个带有 urlencode,一个没有),它会完美地解析编码的 URL。在创建 URL 之前,我必须进行替换。谢谢! 【参考方案1】:

使用 %23 编码 URL 中的哈希

http://twitter.com/home?status=I+believe+in+%23love

“我相信#love”

网址编码参考:http://www.w3schools.com/tags/ref_urlencode.asp

【讨论】:

这行得通,令人惊讶的是花了这么长时间才得到正确回答 将此答案标记为正确。我想知道从我第一次询问时浏览器是否发生了变化。我肯定试过 %23。 六年后,我重新审视了这一点,意识到 Spider 是正确的,而我实际上一直在问错误的问题。编辑标题和问题以反映这一点。迟到总比没有好,对吧?

以上是关于使用 mod_rewrite 将带有哈希字符的路径转换为查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite:将路径和查询字符串 URL 作为参数传递

Mod_rewriting 将查询字符串写入 swf 文件

使用 mod_rewrite 重定向查询字符串(反之亦然)

mod_rewrite:从 URL 中删除查询字符串?

使用 Mod_Rewrite 将 ROOT 重写到另一个路径

带有 mod_rewrite 的不区分大小写的 URL