添加 RewriteRule 到允许链接锚定同一页面中的某个部分

添加 RewriteRule 到允许链接锚定同一页面中的某个部分

我以前使用第三方托管服务托管我的网站,锚链接总是很容易。然后我决定设置我的 VPS。除了锚链接之外,一切都运行良好。

我发现 Apache 默认不允许我在访问 URL 时使用某些符号,但也可以采用 mod_rewrite 来解决这个问题。根据 Apache 的文档,只要我可以选择通过文件<Directory>而不是通过.htaccess文件添加重写规则,我就会选择通过文件添加重写规则。此外,要启用重写引擎,必须启用RewriteEngine OnOptions FollowSymLinks。考虑到我已经在使用 RewriteRules 强制通过 HTTPS 进行访问(而且这种方法有效),我相信我的系统已经准备好接收 RewriteRules 了。

因此,我将重写规则添加到,<Directory>但它没有达到预期的结果,即访问mydomain.com/pageA/sectionB锚点而不是访问mydomain.com/pageA#sectionB。也许我将 RewriteRule 添加到了错误的位置,因为我在 Apache 的文档中发现此规则完全符合我的预期。我做错了什么吗?请按照我的“.conf”文件操作。

<VirtualHost *:80> 
  Servername mydomain.com 
  ServerAlias www.mydomain.com 

  RewriteEngine on 
  RewriteCond %(SERVER_NAME) =mydomain.com [OR] 
  RewriteCond %(SERVER_NAME) =www.mydomain.com 
  RewriteRule https://%{SERVER_NAME}%{REQUEST_URI} [END=301,L] 
</VirtualHost> 

<VirtualHost _default_:443> 
  ServerAdmin [email protected] 
  DocumentRoot /var/www/html/mydomain.com/ 
  ServerName mydomain.com 
  ServerAlias www.mydomain.com 

<Directory /var/www/html/mydomain.com/> 
  Options Indexes FollowSymLinks MultiViews 
  AllowOverride ALL 
  Order allow,deny 
  Allow from all 

  RewriteEngine on 
  RewriteRule "^/pageA/sectionB/" "/pageA#sectionB/" [NE,R]
</Directory> 

ErrorLog ${APACHE_LOG_DIR}/error.log 
CustomLog ${APACHE_LOG_DIR}/access.log combined 

SSLEngine on 
SSLCertificateFile /etc/ssl/certs/my_certificate.cer 
SSLCertificatekeyFile /etc/ssl/private/my_key.key 

</VirtualHost> 

答案1

RewriteRule "^/pageA/sectionB/" "/pageA#sectionB/" [NE,R]

此指令在以下情况下不匹配:目录上下文(即<Directory>容器内或.htaccess),因为你尝试匹配的 URL 路径上有斜杠前缀。在目录上下文,目录前缀(始终以斜杠结尾)首先从指令RewriteRule匹配的 URL 路径中删除,因此 URL 路径永远不会以斜杠开头。

因此,基本上,你只需要删除斜线前缀:

RewriteRule ^pageA/sectionB/ /pageA#sectionB/ [NE,R,L]

我还删除了参数周围的引号(只有当参数包含未转义的空格,否则在我看来阅读起来会更困难)。始终L在外部重定向中包含该标志是一种很好的做法 - 虽然这目前是最后一条规则,所以这并不重要(除非您稍后添加更多规则)。


或者,你可以将此规则直接移动到<VirtualHost>容器内部(即虚拟主机上下文)。在这种情况下,该RewriteRule指令与包含斜杠前缀的根相对 URL 路径匹配。

在这种情况下,这实际上是更好的选择,因为任何.htaccessmod_rewrite 指令都将覆盖<Directory>容器,并且容器RewriteRule中的指令<Directory>将不会被处理(除非启用了 mod_rewrite 继承 - 默认情况下是禁用的)。

AllowOverride ALL由于您已在容器中设置,<Directory>因此假定您确实有(或至少可能有)一个.htaccess可能包含 mod_rewrite 指令的文件。如果您禁用.htaccess覆盖(即AllowOverride None),则无关紧要。


在旁边:

RewriteEngine on 
RewriteCond %(SERVER_NAME) =mydomain.com [OR] 
RewriteCond %(SERVER_NAME) =www.mydomain.com 
RewriteRule https://%{SERVER_NAME}%{REQUEST_URI} [END=301,L]

这(HTTP 到 HTTPS 重定向)完全不正确/格式错误。您缺少RewriteRule 图案(第一个) 参数和标志参数格式不正确。它们应该是[R=301,L]

但是,您不需要在这里使用 mod_rewrite,在<VirtualHost *:80>容器内部使用时,简单的 mod_aliasRedirect指令就足够了,而且是首选。

除非您还实施 HSTS,否则您还应该重定向到规范主机名:

例如:

Redirect 301 / https://example.com/

相关内容