多个htaccess url重写哈希(url片段)卡在循环中

时间:2017-07-16 20:02:13

标签: php apache .htaccess mod-rewrite url-rewriting

我有一个带有哈希标记的物理文件:/home/information/index.php#cookies-and-data

如果我浏览它,那么页面滚动到右边部分没问题。

如果我添加一个重写,那么它会重写:/home/information/cookies-and-data到上面然后也可以正常工作。

但是我试图屏蔽物理结构,所以希望/home/information/cookies-and-data重写为/information/index.php#cookies-and-data(但实际上仍然会将网址返回到顶部)

到目前为止我的尝试是

RewriteRule ^information/(.*)$ /information/#$1 [NE,R]
RewriteRule ^information/(.*)$ /home/information/#$1 [NE,L]
RewriteRule ^information$ /home/information [L]

我试图表达:

Transform information/[anything] to information/#[anything]
Transform information/#[anything] to /home/information/#[anything] and return
(or) Transform information to /home/information and return

然而,我陷入无限循环的境地。

我有(也许是错误的)假设,如果规则没有L,那么它将移动下一行,保留已发生的任何重写。

另外,我离开了客户端不会在请求中发送#,因此我试图将其保留在服务器端,直到重写完成。

想法?谢谢!

1 个答案:

答案 0 :(得分:1)

您无法重写为带有哈希的网址,您只能重定向到该网址。

所以,这个规则:

RewriteRule ^information/(.*)$ /information/#$1 [NE,R]

是否将您重定向到预期的URL,但由于服务器无法看到您添加了哈希值,因此它再次适用,因为/information/(没有哈希的部分)匹配^information/(.*)$,因此无限循环。

您必须重定向到其他网址以避免无限循环。

关于L标志,并不意味着匹配的重定向将等到重写处理器找到它。在您使用L标记到达规则之前,您可能会被重定向:

  

当处理重写请求时,可能会再次遇到.htaccess文件或部分,因此可以从头开始再次运行规则集。 最常见的情况是,如果其中一条规则导致redirec t(内部或外部)导致请求进程重新开始,则会发生这种情况。

这是https://httpd.apache.org/docs/current/rewrite/flags.html

这正是这里发生的事情。其余规则未经处理,因为第一个规则一遍又一遍地重定向到同一个URL。