[摘要]为什么 apache 将经过重写引擎的 https 重定向到 http
我有一个网站正在将一些页面(仅经过重写的页面)从 https 重定向到 http。
包括 ssl 配置上的重写日志都没有显示任何内容,没有重写等等。
重定向在到达 php 之前发生,因此不可能有任何header()
调用执行此操作。无论如何,我已经检查过了,事实并非如此。(它是内部软件,简单的 4 文件 php 应用程序)
在谷歌上搜索很棘手,因为我能找到的只是关于重定向 http->https 的教程 :(
版本
Server Version: Apache/2.2.22 (Debian) PHP/5.5.14-1~dotdeb.1 mod_ssl/2.2.22 OpenSSL/1.0.1e
Server Built: Jun 16 2014 03:51:14
下面的 Apache 配置,删除实际的 IP 等。
<VirtualHost <ip>:80>
ServerName <domain>.co.uk
DocumentRoot <root>
php_value include_path .:<root>/include
php_value auto_prepend_file <root>/include/header.php
php_value auto_append_file <root>/include/footer.php
Include <path>/secure.rewrite.conf
Include <path>/rewrite.conf
</VirtualHost>
<VirtualHost <ip>:443>
ServerName <domain>.co.uk
DocumentRoot <root>
php_value include_path .:<root>/include
php_value auto_prepend_file <root>/include/header.php
php_value auto_append_file <root>/include/footer.php
Include <path>/rewrite.conf
Include <path>ssl.conf
SSLCertificateKeyFile <cert>.key
SSLCertificateFile <cert>.crt
SSLCertificateChainFile <cert>.ca-bundle
</VirtualHost>
安全重写配置文件
RewriteEngine On
RewriteCond %{SERVER_PORT} ^80
RewriteRule ^/login https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
重写配置文件
RewriteRule ^/dir/forgot_password/(.*) /dir/forgot_details.php?hash=$1 [L,QSA]
RewriteRule ^/dir/forgot_password /dir/forgot_details.php [L,QSA]
RewriteRule ^/dir/login /dir/login.php [L,QSA]
RewriteRule ^/dir/logout /dir/login.php?logout=1 [L,QSA]
RewriteRule ^/dir/settings /dir/settings.php [L,QSA]
RewriteRule ^/dir/(PO|EC)\.([A-Za-z0-9\.]+)/despatchnote/print /dir/despatch_note.php?encore_id=$1\.$2&print=1 [L,QSA]
RewriteRule ^/dir/(PO|EC)\.([A-Za-z0-9\.]+)/despatchnote /dir/despatch_note.php?encore_id=$1\.$2 [L,QSA]
RewriteRule ^/dir/(PO|EC)\.([A-Za-z0-9\.]+)/print /dir/view.php?encore_id=$1\.$2&print=1 [L,QSA]
RewriteRule ^/dir/(PO|EC)\.([A-Za-z0-9\.]+)/action /dir/view.php?encore_id=$1\.$2&action=1 [L,QSA]
RewriteRule ^/dir/(PO|EC)\.([A-Za-z0-9\.]+) /dir/view.php?encore_id=$1\.$2 [L,QSA]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^ <root>/webroot/index.php [L]
ssl.conf
SSLEngine on
<Directory /public/*/htdocs>
SSLRequireSSL
</Directory>
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA 3DES RC4 !aNULL !eNULL !LOW !MD5 !EXP !PSK !SRP !DSS +3DES 3DES +RC4 RC4"
SSLHonorCipherOrder on
SSLCompression off
答案1
好的,找到问题了。
该特定配置在配置中没有RewriteEngine on
,它在没有 https 的情况下工作,因为在某处 http 配置开始重写。
重定向是由于 apache 没有找到任何东西(因为它应该被重写为一个实际的文件,但事实并非如此),然后提供 404 页面,该页面以某种方式重定向到 http 版本。
这就是为什么对实际文件的请求有效的原因,因为 apache 能够提供文件,因此不会发生 404 错误。
最好将这个讨厌的RewriteEngin On
呼叫放在全球某个地方,这样它要么一直打开,要么一直关闭。