在Apache上强制HTTPS,结果很奇怪

时间:2017-06-18 17:23:47

标签: php apache .htaccess ssl mod-rewrite

我刚刚为我的网站购买了SSL证书,我正试图强制使用HTTPS。它有点工作但不是真的。我在Apache上使用PHP Slim框架进行自定义路由。

我的文件夹结构

root/
   .htaccess (A)
   php/
   public_html/
     .htaccess (B)

.htaccess(A)

我的主要htaccess文件有这些规则

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

当我转到example.com时,它会进入安全页面。太好了!

.htaccess(B)

我的public_html文件有这些规则

<IfModule mod_rewrite.c>
    RewriteEngine on
    #RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
</IfModule>


# Always use https for secure connections
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

问题:

如果我转到http://www.example.com/login

而不是重定向到https://www.example.com/login

重定向到https://www.example.com/index.php

1 个答案:

答案 0 :(得分:2)

htaccess-files中的规则从上到下进行验证。在您的htaccess中,它首先检查服务器上是否存在所请求的资源(/ login)。如果没有,则将请求重定向到index.php。

如果您只是在其他规则之前移动了https-check / redirect ,它应该可以正常工作。

<IfModule mod_rewrite.c>
    RewriteEngine on
    #RewriteBase /

    # Always use https for secure connections
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

    # Redirect requests to non existing resources to index.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
</IfModule>

我还删除了第二个RewriteEngine On。拥有它就足够了。