在laravel 5.2中将http重定向到https

时间:2017-05-16 19:54:33

标签: laravel .htaccess ssl redirect https

我有一个Laravel 5.2项目。最近,我在我的网站上安装了SSL证书,所以当我在浏览器中输入https://example.com时,它可以正常工作,但当我写example.com时,它会通过HTTP连接。

为了解决这个问题,我将这些行添加到.htaccess文件中:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

之后,当我输入example.com时,浏览器会将我重定向到https://example.com。那是完美的。

问题是当我尝试访问网址http://example.com/download/get/book/volume2时,它不会将我重定向到HTTPS。它将我重定向到索引页面。如果我在网址中添加s https,则可以正常运行,但我需要该应用将我从HTTP重定向到HTTPS。

路线档案中的路线:

Route::get('download/get/book/{book}'

该路线会在浏览器标签的privates/storage文件夹中打开PDF文件。

编辑:

我的.htaccess文件:

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# require SSL 
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2 个答案:

答案 0 :(得分:4)

您的HTTP到HTTPS重定向需要在.htaccess指令之后立即靠近RewriteEngine文件的顶部,重要的是之前 Laravel 前面控制器

作为一般规则,外部重定向应始终在内部重写之前进行。

前端控制器捕获所有请求(或者更确切地说是不映射到物理文件或目录的请求),并将这些请求重写为index.php(最终处理路由)。问题是您的HTTP到HTTPS重定向会在以后发生,并将现在重写的URL转换为外部重定向到index.php

同样,您的# Handle Authorization Header块也应该在前端控制器之前(理想情况下)。 (由于.htaccess文件的循环性质,它将在其当前状态下在每个目录.htaccess文件中工作,但如果将这些指令移动到服务器配置,则会失败。)

答案 1 :(得分:0)

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteEngine On文件中的.htaccess下方添加上述两行。它将自动将发往http:的所有流量重定向到https:

最后,您的.htaccess文件如下所示

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Redirect to https
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>