我的配置文件设置如下:
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://example.com/%$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /ssd/www/
SSLEngine on
SSLCertificateFile /ssd/certs/example_com.crt
SSLCertificateKeyFile /ssd/certs/example_com.key
SSLCertificateChainFile /ssd/certs/example_com.ca-bundle
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
问题是,当导航到标准 HTTP 页面时,它会重定向/%25/
到域,例如..
http://example.com
改为https://example.com/%25/
,http://example.com/my-category/my-page
改为https://example.com/%25/my-category/my-page
。
答案1
也许第 4 行应该是:
RewriteRule (.*) mydomain.com/$1 [R,L]
%25 是 % 的 URL 编码值
答案2
正如 Vikelidis 已经指出的那样,%$1
这是错误的。但是,您还有其他问题需要解决。
RewriteCond
端口 80中的 HTTPS(即端口 443)指令检查是VirtualHost
多余的,应该删除。
此外,在服务器配置中使用时,该RewriteRule
模式与完整的 URL 路径匹配,包括斜线前缀。替换后将产生双斜线。Apache 稍后会折叠此斜线以解析请求,但是在某些情况下它仍然可用,因此可能会破坏后续规则。
此重定向也应是永久的 301,而不是临时的 302(默认值) - 但只有当您确定它正常工作时才更改它。
因此,如果使用 mod_rewrite,则应写成:
<VirtualHost *:80>
RewriteEngine on
RewriteRule /(.*) https://example.com/$1 [R=301,L]
</VirtualHost>
再次强调,这里根本不需要 mod_rewrite。mod_aliasRedirect
会更高效:
<VirtualHost *:80>
Redirect 301 / https://example.com/
</VirtualHost>