我正在尝试将整个站点重写为HTTPS,但有一个例外是通过普通HTTP。
无论我做什么,%{HTTPS}
似乎始终为off
而%{SERVER_PORT}
始终为80
。即使我通过https://...
成功访问该网站。在PHP中转储$_SERVER
全局显示正确的值(HTTPS为on
等)。
mod_rewrite
何时确实知道这些服务器变量的值,或者我的服务器配置是否被某种方式破坏了?
我使用LogLevel debug rewrite:trace6
来查找问题,似乎服务器认为HTTPS永远不会启用。
我有两个虚拟主机,一个用于80个流量,一个用于443个流量。是否有可能在443虚拟主机中没有正确读取我的.htaccess
重写规则?
自签名证书可以创建这样的问题吗?一旦我接受每个会话的“冒险”证书,我就可以访问该网站。
我正在运行Apache 2.4 +,php5-fpm,该网站是WordPress多站点。这是我目前的.htaccess
:
RewriteEngine On
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{HTTP_HOST} ^example.dev
RewriteCond %{REQUEST_URI} !^/nohttps.*
RewriteRule ^(.*)$ https://example.dev/$1 [L,R=301]
RewriteCond %{SERVER_PORT} ^443$ # This line never matches according to logs.
RewriteCond %{HTTP_HOST} ^example.dev
RewriteCond %{REQUEST_URI} ^/nohttps.*
RewriteRule ^(.*)$ http://example.dev/$1 [L,R=301]
# WordPress' own rules onwards.
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
由于第二个%{SERVER_PORT}
从不匹配(80!= 443),所有example.dev/nohttps
个请求都会被. index.php [L]
重写,并将其重定向到主页。
此外,我已在两个虚拟主机中将UseCanonicalPhysicalPort
设置为on
。