【问题标题】:Redirect http to https in laravel 5.2在 laravel 5.2 中将 http 重定向到 https
【发布时间】:2017-10-16 01:35:54
【问题描述】:

我有一个 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。太完美了。

问题是当我尝试访问 URL http://example.com/download/get/book/volume2 时,它不会将我重定向到 HTTPS。它会将我重定向到索引页面。如果我在 URL 中添加 httpss ,它可以正常工作,但我需要应用程序将我从 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]

【问题讨论】:

  • 您在这些“子目录”中是否还有其他.htaccess 文件? (它们是物理子目录吗?)
  • 不,我有一个“public_html”文件夹,其中是我的 .htaccess 和一个“privates”文件夹,其中包含所有视图、控制器等
  • 在这种情况下,您在.htaccess 文件的哪个位置添加了这些指令?请在您的问题中包含您的.htaccess 文件的内容。

标签: laravel .htaccess ssl redirect https


【解决方案1】:

您的 HTTP 到 HTTPS 重定向需要靠近您的 .htaccess 文件的顶部,紧跟在 RewriteEngine 指令之后,并且重要的是, Laravel 前端控制器.

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

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

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

【讨论】:

  • 感谢您的回答。我做了你说的改变,但它仍然不起作用。
  • 确保在测试前清除浏览器缓存。较早的(错误的)301 将被浏览器缓存。 (出于这个原因,通常最好使用 302 进行测试 - 以避免缓存。)
【解决方案2】:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

在您的.htaccess 文件中的RewriteEngine On 正下方添加上述两行。它会自动将任何发往 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>

【讨论】:

  • 这个解决方案对我有用。 # 重定向到 https RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  • 它在我的共享主机服务器上运行良好
  • 这不会添加现有答案尚未解决的任何内容。事实上,您对 HTTP 到 HTTPS 指令所做的细微更改是不正确的。出于某种原因,您已将 301(永久)重定向更改为 隐含 302(临时)重定向。这对于测试来说很好,但重定向在生产中应该是 301。您还将RewriteRule 模式^ 更改为(.*) - 为什么? ^ 在这里效率更高。正则表达式 (.*) 不必要地遍历整个 URL 路径并捕获反向引用,该反向引用未在指令中使用。
猜你喜欢
  • 2023-03-24
  • 2018-02-02
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多