HTACCESS:需要重写URL以锚定链接URL

时间:2017-01-27 07:19:09

标签: php apache .htaccess mod-rewrite

我遇到了一个似乎并不新鲜或令人兴奋的问题,但我发现的所有答案似乎都没有效果。我觉得为.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,如果该文件不存在。

1 个答案:

答案 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安全地解析它,您将需要转义该片段。