页内锚链接的{htaccess异常

时间:2018-01-08 15:04:55

标签: regex .htaccess

我在.htaccess文件中使用指令来清理我的网站网址。

例如,该指令添加了一个尾部斜杠:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

并删除文件扩展名:

# hide .php file extensions
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# redirect .html to /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC]
RewriteRule ^ %1 [R,L]

# redirect .htm to /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.htm [NC]
RewriteRule ^ %1 [R,L]

我遇到的问题是使用页内锚点。当我创建指向页面部分的链接时,如下所示:

https://www.mywebsite.com/privacy-policy#information-we-collect

系统输出:

https://www.mywebsite.com/privacy-policy/#information-we-collect

当涉及页内锚链接时,如何调整.htaccess文件以使尾部斜杠要求出现异常?

相关的问题是:

虽然这两个链接都有效:

https://www.mywebsite.com/privacy-policy#information-we-collect
https://www.mywebsite.com/privacy-policy/#information-we-collect

... 当他们在页面内(隐私政策,在这种情况下)。

URL永远不会在地址栏中调整以显示片段标识符(#...)。地址栏固定为:

https://www.mywebsite.com/privacy-policy/

通常情况下会调整为:

https://www.mywebsite.com/privacy-policy#information-we-collect

最后,虽然这些带有片段标识符的链接在其页面中起作用,但是带有片段标识符的链接到另一个页面却不起作用。

所以,如果我在隐私政策页面上,所有这些链接都可以正常工作:

https://www.mywebsite.com/privacy-policy#information-we-collect
https://www.mywebsite.com/privacy-policy/#information-we-collect
https://www.mywebsite.com/terms-of-service/

但这完全没有反应:

https://www.mywebsite.com/terms-of-service#limitation-of-liability

它仅适用于服务条款页面。

1 个答案:

答案 0 :(得分:1)

将我的评论转换为答案。

此例外不起作用:

  1. 因为网络服务器(或重写规则)对锚点一无所知,因为从 #开始的部分网址完全在浏览器中处理,并且未发送到网络服务器。
  2. #information-we-collect部分未被发送到网络服务器,因此为#...创建例外并不能真正解决问题。必须有一些其他方法来创建例外,例如添加重写规则可以查看并执行操作的前缀/后缀或虚拟查询参数。
  3. 或者,您可以在客户端本身处理它,即在Javascript代码中。