如何使用htaccess将url重写为html锚标记(#)

问题描述 投票:0回答:4

我有一个情况,我想获取以下 URL:

/1/约翰

并使用 Apache 的 htaccess 文件将其重定向到

/page.php?id=1&name=john#john

这样它就会转到名为 john 的 html 锚点。

我发现了很多关于转义特殊字符和添加 [NE] 标志以便重定向忽略 # 符号的参考,但这些不起作用。例如,添加 [NE,R] 表示该 URL 就如原样出现在浏览器地址中: http://example.com/page.php?id=1&name=john#john.

.htaccess mod-rewrite uri-fragment
4个回答
28
投票

这可以使用 [NE] 标志(无转义)。

默认情况下,特殊字符(例如 & 和 ?)将转换为其等效的十六进制代码。使用 [NE] 标志可以防止这种情况发生。

更多信息http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_ne


6
投票

您可以执行其中一项操作,但不能同时执行两项操作。

您可以使用 [NE] 标志向 Apache 表示不要转义“#”字符,但为了使重定向正常工作,您必须指定要重定向到的绝对 URL,而不仅仅是相对页面。 Apache 无法为您将窗口向下滚动到锚点。但如果您重定向到绝对 URL,浏览器就会这么做。


3
投票

你想做的事情,可以通过URL重写,或者更具体地说,URL美化来完成。

我很快就为您找到了这篇解释良好的博客文章,我希望它可以帮助您解决学习重写 URL 部分

至于

#
的事情(希望你现在知道我在说什么),我认为将同一个变量传递给重写的 URL 两次不会有问题。就像:(注意第一行的最后一部分)

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$  /$1/$2/#$2 [R]
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&subpage=$2

不过,你必须逃避

#
部分,并且 看起来 可以这样做:

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$  /$1/$2/\%23$2 [R,NE]

顺便说一句,URL 重写并不难(但可能会变得复杂,而且我不是专家),但 Google 可以在此过程中提供很多帮助。


0
投票
/1/john#john

。锚点不是请求 uri 的一部分。

    

© www.soinside.com 2019 - 2024. All rights reserved.