17

我有一种情况,我想采用以下 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

4

4 回答 4

26

这可以使用[NE] 标志(noescape)。

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

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

于 2010-11-24T13:17:43.773 回答
4

You can in fact do one of these things, but not both.

You can use the [NE] flag to signify to Apache not to escape the '#' character, but for the redirect to work, you have to specify an absolute URL to redirect to, not simply a relative page. Apache cannot do the scrolling of the window down to the anchor for you. But the browser will, if you redirect to an absolute URL.

于 2013-01-10T21:44:27.653 回答
2

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

我很快就为您找到了这篇解释清楚的博客文章,希望它可以帮助您学习重写 URLs-part

至于#-thing(希望您现在知道我在说什么),我认为将相同的变量传递给重写的 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

不过,您必须避开#-part,而且似乎可以通过以下方式完成:

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

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

于 2010-05-20T10:02:34.747 回答
0

您不能对锚点进行内部重定向。(想想看:Apache 如何向下滚动到锚点?)您的链接应该指向/1/john#john. 锚点不是请求 uri 的一部分。

于 2010-05-20T09:53:53.843 回答