我以前使用第三方托管服务托管我的网站,锚链接总是很容易。然后我决定设置我的 VPS。除了锚链接之外,一切都运行良好。
我发现 Apache 默认不允许我在访问 URL 时使用某些符号,但也可以采用 mod_rewrite 来解决这个问题。根据 Apache 的文档,只要我可以选择通过文件<Directory>
而不是通过.htaccess
文件添加重写规则,我就会选择通过文件添加重写规则。此外,要启用重写引擎,必须启用RewriteEngine On
和Options 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 路径匹配。
在这种情况下,这实际上是更好的选择,因为任何.htaccess
mod_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/