我有一个带有哈希标记的物理文件:/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,那么它将移动下一行,保留已发生的任何重写。
另外,我离开了客户端不会在请求中发送#,因此我试图将其保留在服务器端,直到重写完成。
想法?谢谢!
答案 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。