【问题标题】:How to force Laravel Project to use HTTPS for all routes?如何强制 Laravel 项目对所有路由使用 HTTPS?
【发布时间】: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 链接?

【问题讨论】:

    标签: php ssl https routes laravel-5.2


    【解决方案1】:

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

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

    【讨论】:

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

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

    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');
      

    更新:

    1. 路由组的隐式设置方案(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 对我来说表现得很时髦,但这很有效。


    1. https代码sn-p.

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


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

    • 1:打开 app/providers/RouteServiceProvider.php
    • 2:然后将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>
                

                【讨论】:

                  猜你喜欢
                  • 2021-08-20
                  • 1970-01-01
                  • 2019-12-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-09-27
                  • 1970-01-01
                  • 2018-03-15
                  • 2011-03-19
                  相关资源
                  最近更新 更多