我遇到了一个似乎并不新鲜或令人兴奋的问题,但我发现的所有答案似乎都没有效果。我觉得为.htaccess编程有一百万种方法来解决问题,但我永远找不到/使用正确的方法。
我想采用一个已经很干净的网址:
http://example.com/page/link
并进行内部重写:
http://example.com/page#link
我的消息来源:
http://stackoverflow.com/questions/2872490/how-to-use-htaccess-to-rewrite-url-to-html-anchor-tag
http://stackoverflow.com/questions/21391449/how-to-use-sign-as-an-anchor-while-url-rewriting-with-htaccess-on-apache
http://stackoverflow.com/questions/29165917/htaccess-rewrite-url-to-hash-anchor-on-homepage
http://stackoverflow.com/questions/2686075/mod-rewrite-with-anchor-link
http://stackoverflow.com/questions/2285193/htaccess-redirect-to-page-with-anchor-link
我已阅读所有答案和评论,以便找到解决我特定问题的方法。到目前为止,没有任何工作。我甚至无法进行简单的测试工作,似乎重写工作根本不起作用。
您可以在此处找到我当前的.htaccess文件:http://pastebin.com/xJWHq70f
注意:网络主机是Netfirms。我已经禁用了Netfirms'默认.htaccess foolery。
所以回顾一下,我试图获取一个已经很干净的URL并进一步解析并重写从page / test到page #test。我的.htaccess的最后一行确实有
RewriteRule ^ about-me /(.*)$/ about-me#$ 1 [NE,R](没有工作)
理论上,在 about-me/who-am-i
的页面上创建链接时,我应该转到 http://example.com/about-me#who-am-i
,同时保持地址栏看起来像 http://example.com/about-me/who-am-i
即可。这时我有一个特定的页面,我希望在about-me.php页面上启用此重写。
谢谢,
道格
PS
很抱歉没有10+代表,所以我可以正常发布所有链接
2016年1月27日更新
进一步审查和进一步调查证明我完成的工作根本无法完成。没问题。我已经换了档,改变了我喜欢导航系统的方式。
相反,我会使用 about-me 页面作为基础,并创建所需的额外必要页面。由于页面上有很多文字,最好将其分解为更好的阅读部分 - 现在是单独的页面。
使用William提出的想法,我能够快速拼凑出一个解决方案。我原来的.htaccess代码删除了.php扩展名然后将.php扩展名重定向到非扩展名等价格被破坏并导致500错误。修复!
使用以下代码:
RewriteRule ^about-me/(.*) /$1 [L,NC]
我可以拥有任何网址 about-me / stats 或 about-me / testing123 ,只要实际的stats.php或testing123.php存在于根目录中它将在内部正确重定向 - 保留一个漂亮的干净URL,而404,如果该文件不存在。
答案 0 :(得分:0)
好的重要的是要确保你进行内部重写,而不是外部重写
所以这会奏效:
RewriteRule ^page/(.*) /page#$1 [L]
确保不添加[R = 301]标志(或R的任何其他值),否则它将向客户端提供响应。根据RFC 3986和RFC 1738,客户端在解除引用URI时会删除片段标识符。
修改强>
虽然Apache会重写URL以包含片段,但PHP可能会barf。根据RFC 1738:
字符“#”不安全,应始终进行编码,因为它是 在万维网和其他系统中用于分隔来自的URL 可能跟随它的片段/锚标识符...所有不安全 字符必须始终在URL中编码...例如, 字符“#”必须在URL中编码,即使在不支持的系统中也是如此 通常处理片段或锚标识符,以便如果URL 被复制到另一个使用它们的系统,它不会 需要更改URL编码。
因此,如果您希望PHP安全地解析它,您将需要转义该片段。