如何强制 Laravel 项目对所有路由使用 HTTPS?

Posted

技术标签:

【中文标题】如何强制 Laravel 项目对所有路由使用 HTTPS?【英文标题】:How to force Laravel Project to use HTTPS for all routes? 【发布时间】:2016-06-20 00:27:04 【问题描述】:

我正在处理一个需要安全连接的项目。

我可以通过以下方式设置路由、uri、资产以使用“https”:

Route::get('order/details/id', ['uses' => 'OrderController@details', 'as' => 'order.details', 'https']);

url($language.'/index', [], true)

asset('css/bootstrap.min.css', true)

但一直设置参数似乎很累。

有没有办法强制所有路由生成 HTTPS 链接?

【问题讨论】:

【参考方案1】:

将它放在 boot() 方法中的 AppServiceProvider 中

if($this->app->environment('production')) 
    \URL::forceScheme('https');

【讨论】:

这是一个不错的选择,而不是更新任何服务器文件。 感谢它在 laravel 7 和 8 中完美运行,再次感谢【参考方案2】:

这里有几种方法。选择最方便的。

    配置您的网络服务器以将所有非安全请求重定向到 https。 nginx 配置示例:

    server 
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name example.com www.example.com;
        return 301 https://example.com$request_uri;
    
    

    使用 https 设置您的环境变量 APP_URL

    APP_URL=https://example.com
    

    使用助手secure_url() (Laravel5.6)

    将以下字符串添加到 AppServiceProvider::boot() 方法(适用于 5.4+ 版本):

    \Illuminate\Support\Facades\URL::forceScheme('https');
    

更新:

    路由组的隐式设置方案(Laravel5.6):

    Route::group(['scheme' => 'https'], function () 
        // Route::get(...)->name(...);
    );
    

【讨论】:

在我的 Laravel 5.7.26 5. 中以某种方式禁用了该网站,但是 4. 起到了魅力 :) 我在 HostGator 上托管我的网站,我进入 cPanel 工具并修改了我的 Laravel 5.7 代码并执行了第 4 次,当我通过输入 mysite.tech 访问我的网站时,我仍然会收到到我网站的不安全版本。如果我隐含地输入mysite.tech,那么它就可以工作。知道为什么 4 不起作用吗?【参考方案3】:

您可以在config/app.php 中设置'url' => 'https://youDomain.com',也可以使用中间件类Laravel 5 - redirect to HTTPS。

【讨论】:

中间件是要走的路。设置“url”属性对我不起作用(L 5.1)。 这仍然不令人满意。这只意味着通往http的路由会被转发到https的路由,但是转发对SEO排名不利 这应该由 .env 中的 APP_URL 变量设置 我的项目中有 API,这会按原样运行 API 吗?【参考方案4】:

我在web.phpapi.php 文件的末尾使用了它,它运行良好:

URL::forceScheme('https');

【讨论】:

我有一个托管我的 laravel 应用程序的 hostgator 帐户。如果我把它放在 Routes/web.php 中,它不会将我的网站重新路由到 https 并且 ssl 证书已打开。 您检查过 .htaccess 文件吗?你也可以在那里强制 https 重定向。 我有两个 htaccess 文件,一个在我的主应用程序目录中,另一个在我的公共 DIR 中。我将您下面帖子中的代码添加到我的主应用程序 .htaccess 文件中。我是否也应该将它添加到我的公共 .htaccess 中? 是的,我认为那是有效的。因为那是 index.php 文件的位置。您的 url 索引页面如何结束?无论如何,如果这对您不起作用,HostGator 提供了令人印象深刻的支持,您也可以评论他们的答案。 这样工作了 :D,但现在唯一的事情是,当网站重新定向时,它会将“/public/”添加到 url 的末尾。你知道我怎样才能把它剪掉吗?【参考方案5】:

在您的 .htaccess 文件中使用以下代码会自动将访问者重定向到您网站的 HTTPS 版本:

RewriteEngine On
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]

【讨论】:

对于 laravel,它应该在公共文件夹中......这对我有用,而这里的其他解决方案在我的 cpanel 服务器上不起作用【参考方案6】:

在 Laravel 7.x (2020) 中强制使用 Https


“2020 年更新?Url::forceScheme 对我来说表现得很时髦,但这很有效。


    https代码sn-p.

    resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https');


    在任何服务提供商启动方法中添加该 sn-p

1:打开 app/providers/RouteServiceProvider.php2:然后将https代码sn-p添加到boot方法中。
    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    
        resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https');

        parent::boot();
    
3:最后运行 php artisan route:clear && composer dumpautoload 清除 Laravel 缓存的路由和缓存的 Service Providers。

【讨论】:

您还需要在.htaccess 中进行配置还是仅此一项就足够了? 谢谢!这是唯一对我有用的解决方案,我只在带有负载均衡器的 AWS Elastic Beanstalk 上遇到了这个问题。我认为 Laravel 无法生成 https toutes,因为负载均衡器和 ec2(ubunto 服务器)之间的连接是 http。 @Nhan 当时不需要配置 .htaccess,这可能是因为它已经正确配置了。 @Husam 有趣的是,在发这篇文章的时候我也在做一个 AWS 项目!话虽如此 - 如果我没记错的话 - 我在本地开发中使用了这个 https 设置。我不确定其他实现是否不起作用,因为我们在本地发生了一些 AWS 事情,或者这只是一个有趣的巧合。无论哪种方式,感谢您指出 AWS 的详细信息!【参考方案7】:

将此添加到您的 .htaccess 代码中

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

将 www.yourdomain.com 替换为您的域名。这将强制您域的所有 url 使用 https。确保在您的域上安装和配置了 https 证书。如果您没有看到绿色的 https 是安全的,请在 chrome 上按 f12 并修复控制台选项卡中的所有混合错误。

希望这会有所帮助!

【讨论】:

这行得通!但在域名后添加index.php 我在域名后面也得到了 index.php? 有什么办法可以避免在最后添加 index.php 吗?它打破了我的路线 任何阅读此内容的人,只需将 'RewriteEngine On' 替换为 your.htaccess 文件中的上述代码【参考方案8】:

我更喜欢forceScheme,而不是在网络服务器上进行。所以 Laravel 应用应该对此负责。

所以正确的方法是在你的app/Providers/AppServiceProvider.php 函数中添加 if 语句 boot

    if (env('APP_ENV') === 'production') 
        \Illuminate\Support\Facades\URL::forceScheme('https');
    

提示:证明你已经正确配置了APP_ENV。转到您的 Linux 服务器,输入 env

这是在 Laravel 5,特别是 5.6 上测试的。

【讨论】:

这在 RouteServiceProvider 中对我有用,但由于某种原因不适用于 AppServiceProvider ?【参考方案9】:
public function boot()

  if(config('app.debug')!=true) 
    \URL::forceScheme('https');
  

在 app/Providers/AppServiceProvider.php 中

【讨论】:

最好根据环境(在这种情况下为非本地)来制作条件,而不是调试设置。【参考方案10】:

对于 laravel 8,如果您尝试了以上所有方法,但浏览器重定向您的次数过多,请在 TrustProxies 中间件中设置代理,如下所示:

App\Http\Middleware\TrustProxies.php

/**
  * The trusted proxies for this application.
  *
  * @var array|string|null
*/
protected $proxies = '*';

【讨论】:

【参考方案11】:

试试这个 - 它会工作 在 RouteServiceProvider 文件中

    $url = \Request::url();
    $check = strstr($url,"http://");
    if($check)
    
       $newUrl = str_replace("http","https",$url);
       header("Location:".$newUrl);

    

【讨论】:

请解释一下这里发生了什么。 需要调用exit;调用头后【参考方案12】:

在您的 .env 文件中,只需使用

FORCE_HTTPS=true

这对我有用,您还可以将 APP Url 设置为 https://your-site.com 作为附加步骤

【讨论】:

【参考方案13】:

我想出了如何在负载平衡的基础架构中做到这一点。

你需要添加你的 Nginx 配置:

location ~ \.php$ 
            include snippets/fastcgi-php.conf;
    #       # With php-fpm (or other unix sockets):
            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;

            add_header X-Forwarded-Proto https;
            add_header X-Forwarded-Port 443;
            add_header Ssl-Offloaded "1";
            add_header Access-Control-Allow-Origin "*";
            fastcgi_param  HTTPS "on";
            fastcgi_param  HTTP_X_FORWARDED_PROTO "https";
    

导入器部分是 add_headers 和 pastcgi_params,它通过 AWS 负载均衡器发挥作用。

【讨论】:

不知什么原因,这是唯一对我有用的东西。 HTTPS "on" 是我唯一需要添加的内容,虽然 nginx 包含类似 fastcgi_param HTTPS $https if_not_empty 的行,但它没有按预期工作,所以我不得不手动添加它并强制后端使用 HTTPS;【参考方案14】:

解决此问题的更好方法是: -> 转到公共文件夹, ->编辑.htaccess 只需在下面添加此代码:

RewriteEngine On
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]

-> 并保存。 -> 关闭并重新打开浏览器。

【讨论】:

【参考方案15】:

在这个文件的类名前加上这个app\Providers\AppServiceProvider.php

use Illuminate\Support\Facades\URL;

然后将这段代码粘贴到app\Providers\AppServiceProvider.php文件的启动函数中

if (config('app.env') === 'production') 
    URL::forceScheme('https');

【讨论】:

【参考方案16】:

这是另一个选项,这适用于 laravel 8.*。不过我不确定低版本:

ASSET_URL 变量添加到您的.env 文件中。

例如:

ASSET_URL=https://secure-domain.com

您可以在这里找到更多信息:Laravel Helpers

提示:注意上面链接中的 cmets。

【讨论】:

【参考方案17】:

仅仅使用.htaccess 文件来实现https 重定向呢?这应该放在 project root (not in public folder) 中。您的服务器需要配置为指向项目根目录。

<IfModule mod_rewrite.c>
   RewriteEngine On
   # Force SSL
   RewriteCond %HTTPS !=on
   RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
   # Remove public folder form URL
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

【讨论】:

【参考方案18】:

我使用的是 Apache 服务器,我认为最高效的只是更改虚拟主机配置。 改成这样

<VirtualHost *:80>
   ServerName www.yourdomain.com
   Redirect / https://www.yourdomain.com
</VirtualHost>

<VirtualHost _default_:443>
   ServerName www.yourdomain.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>

【讨论】:

以上是关于如何强制 Laravel 项目对所有路由使用 HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4:获取 URL::route 以返回 HTTPS URL,而不在路由中强制执行 HTTPS

使用版本控制实现 Laravel API 路由

所有 Laravel 路由都暴露了。如果可能,如何将其移动到 app.js 或缩小

如何在 laravel 4 mcamara 中强制链接翻译

如何使用 Laravel Passport 组织这样的路由保护?

如何在没有范围的情况下在 laravel 路由中使用自定义键?