apache2 将 https 重定向到 http

apache2 将 https 重定向到 http

[摘要]为什么 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呼叫放在全球某个地方,这样它要么一直打开,要么一直关闭。

相关内容