如何强制Laravel Project为所有路由使用HTTPS?

时间:2016-03-06 12:54:40

标签: php ssl https routes laravel-5.2

我正在开发一个需要安全连接的项目。

我可以设置路线,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链接?

14 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:10)

以下是几种方法。选择最方便。

  1. 配置您的网络服务器,将所有非安全请求重定向到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;
    }
    
  2. 使用https:

    设置环境变量APP_URL
    APP_URL=https://example.com
    
  3. 使用助手secure_url()(Laravel5.6)

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

    \Illuminate\Support\Facades\URL::forceScheme('https');
    
  5. 更新

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

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

答案 2 :(得分:8)

Laravel 7.x中的强制Https(2020)


“ 2020更新?Url :: forceScheme对我来说算是时髦,但这像毛钱一样有效。


  1. https代码段

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


  1. 在任何服务提供商启动方法中添加该代码段

  • 1:打开 app/providers/RouteServiceProvider.php
  • 2:然后将https代码段添加到 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的缓存路由和缓存服务提供商。

答案 3 :(得分:7)

将其放置在boot()方法中的AppServiceProvider中

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

答案 4 :(得分:5)

将此添加到.htaccess代码

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

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

希望这有帮助!

答案 5 :(得分:4)

我希望使用forceScheme而不是在Web服务器上进行操作。因此Laravel应用应该对此负责。

正确的方法是在boot的{​​{1}}函数内添加if语句

app/Providers/AppServiceProvider.php

提示:证明您已正确配置APP_ENV。转到您的Linux服务器,输入 if (env('APP_ENV') === 'production') { \Illuminate\Support\Facades\URL::forceScheme('https'); }

这已在Laravel 5(特别是5.6)上进行了测试。

答案 6 :(得分:3)

我在web.phpapi.php文件的末尾使用了它,并且效果很好:

URL::forceScheme('https');

答案 7 :(得分:3)

public function boot()
{
  if(config('app.debug')!=true) {
    \URL::forceScheme('https');
  }
}

在app / Providers / AppServiceProvider.php

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

FORCE_HTTPS=true

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

答案 10 :(得分:0)

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

您需要在 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 负载均衡器发挥作用。

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

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

App\Http\Middleware\TrustProxies.php

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

答案 13 :(得分:-1)

尝试一下-它会起作用 在RouteServiceProvider文件中

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

    }