当前位置: 首页 > 知识库问答 >
问题:

Laravel将所有请求重定向到HTTPS

司马渝
2023-03-14

我们的整个网站将通过https提供服务。我在每条路线上都有“https”。但是,如果他们试图通过http将其重定向到https,我该如何将其重定向到https?

Route::group(array('https'), function()
{
     // all of our routes
}

共有3个答案

乔凯康
2023-03-14

对于使用Laravel 4/5和Elastic Beanstalk的用户,使用这些方法强制使用HTTPS是很困难的,因为IsSecurity()将返回false。此外,使用.htaccess重定向将导致Chrome的重定向循环,并延迟Firefox中的页面加载时间。

此设置是为

  • Laravel 5并且可能为Laravel 3/4工作
  • 应用程序加载到运行EC2服务器实例的弹性豆茎上
  • 用于DNS解析的路由53
  • 云锋用于所有资产的全局CDN和执行HTTPS
  • 我在Windows机器上运行aws。Linux可能略有不同?

经过数小时的尝试,我成功地通过以下步骤将所有HTTP请求转发到HTTPS:

>

  • 获取SSL证书。指南和提供商很多,可以通过谷歌搜索找到。

    使用aws控制台命令将证书上传到AWS。指挥结构为:

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    

    创建一个弹性Beanstalk应用程序。继续执行设置过程。安装应用程序后,转到配置-

    选择安全监听器端口为443。选择协议为HTTPS。从步骤2中选择SSL证书ID的CERTIFICATE_NAME。保存配置。

    转到您的控制台。单击EC2实例。单击负载均衡器。单击负载均衡器。单击实例并向下滚动以查看分配给该负载均衡器的EC2实例。如果EC2实例与您的应用程序URL具有相同的名称(或接近的名称),请注意负载均衡器的DNS名称。它应该是格式awseb-e...

    回到你的控制台。单击CloudFront。单击创建分发。选择一个Web分发。

    设置分发。将您的源域名设置为在步骤5中找到的负载平衡器DNS名称。将查看器协议策略设置为将HTTP重定向到HTTPS。将“转发查询字符串”设置为“是”。将备用域名(CNAMEs)设置为要用于应用程序的URL。将SSL证书设置为在步骤2中上载的证书\u名称。创建您的发行版。

    在CloudFront中单击您的分发名称。单击“原点”,选择原点,然后单击“编辑”。确保您的源协议策略是匹配查看器。回去单击行为,选择原点,然后单击编辑。将转发头更改为白名单并添加主机。拯救

    去你的控制台。单击路线53。单击“托管区域”。单击“创建托管分区”。设置你的域名。设置完成后,单击“创建记录集”。输入您的记录。选择Alias作为是。您的别名目标是CloudFront发行版。保存记录。

    为域设置名称服务器以指向路由53名称服务器。等待一切传播,可能需要几个小时。转到你的URL。您将自动重定向到HTTPS。

    “但是,等等,我的链接不会转到HTTPS!?”您需要处理CloudFront将通过的X-Forwarded-Proto头。对于Laravel 4,请遵循本指南。对于Laravel 5,运行以下命令:

    php artisan make:middleware EB_SSL_Trust
    

    然后将其添加到EB\u SSL\u Trust文件中:

        public function handle($request, Closure $next)
        {
            $request->setTrustedProxies( [ $request->getClientIp() ] );
            return $next($request);
        }
    

    并将其添加到您的App\Http\Kernel.php文件中:

        protected $middleware = [
            ...
            'App\Http\Middleware\EB_SSL_Trust',
            ...
        ];
    

    注意:您的所有资产,如CSS、JS或图像,都需要通过HTTPS发送。如果使用Laravel创建这些链接,请使用secure_asset()在视图中创建HTTPS URL。

  • 公孙智
    2023-03-14

    另一个答案可能是让web服务器处理这个问题。如果您使用的是Apache,则可以使用RedirectSSL功能确保所有请求都将发送到站点的HTTPS版本,如果没有,则可以重定向它们。这将在拉威尔收到请求之前发生。

    Apache重定向SSL

    如果您使用的是NGINX,那么可以通过使用两个服务器块来实现这一点。一个用于端口80上的正常HTTPS,另一个用于端口443上的HTTPS。然后将普通服务器块配置为始终重定向到ssl版本。

    server {
        listen 80;
        server_name mydomain.com;
        rewrite ^ https://$server_name$request_uri? permanent;
    }
    
    server {
        listen 443;
        server_name mydomain.com;
        ssl on;
        # other server config stuff here.
    }
    

    我个人会选择这个选项,因为PHP本身不需要处理任何事情。在web服务器级别处理这样的检查通常比较便宜。

    阎知
    2023-03-14

    使用App::before

    您可能能够利用App/filters.php文件中的App::before()块。

    将块更改为包括一个简单的检查,以查看当前请求是否安全,如果不安全,则重定向它。

    App::before(function($request)
    {
        if( ! Request::secure())
        {
            return Redirect::secure(Request::path());
        }
    });
    

    使用过滤器

    另一个选择可能是创建这样的过滤器。人们通常也将其存储在app/filters.php中。

    Route::filter('force.ssl', function()
    {
        if( ! Request::secure())
        {
            return Redirect::secure(Request::path());
        }
    
    });
    

    然后,您可以像这样对任何路由、路由组或控制器强制执行该新筛选器。

    个别路线

    Route::get('something', ['before' => 'force.ssl'], function()
    {
        return "This will be forced SSL";
    });
    

    路线组

    Route::group(['before' => 'force.ssl'], function()
    {
        // Routes here.
    });
    

    控制器

    您需要在控制器的__construct()方法中执行此操作。

    public function __construct()
    {
        $this->beforeFilter('force.ssl');
    }
    
     类似资料:
    • 我将spring saml扩展与Apache2.2+Tomcat7.0+OKTA(IdP)一起使用。securitycontext.xml如下所示: MetadataGeneratorFilter: 谢谢 奈良 HTTP请求转储:

    • 当我们使用AWS应用型负载均衡将传入请求重定向到我们的服务器时,我们创建了一个SSL证书并将其设置为负载均衡器。它同时监听HTTP 80和HTTPS 443端口的流量。在这两种情况下,流量都被重定向到目标组实例的HTTP 80端口。 在这些情况下,有nginx服务器配置为侦听它们所在的实例的HTTP 80端口。 当我更新nginx.conf文件以将传入的HTTP请求重定向到HTTPS协议时,我们面

    • 我们使用拉维5。要将http连接重定向到https,请使用中间件HttpsProtocol。 在我们的4个测试用例中,只有1个正确工作(最后一个重定向)。其他3种情况的中间件添加了url extra index.php。 http://www.aqualink.az/index.php ---

    • 我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定

    • 问题内容: 我正在构建我的第一个Angular.js应用程序,并且正在使用Yeoman。 Yeoman使用Grunt来允许您使用命令’grunt server’运行node.js连接服务器。 我正在html5模式下运行我的angular应用程序。根据angular文档,这需要修改服务器以将所有请求重定向到应用程序的根目录(index.html),因为angular应用程序是单页ajax应用程序。

    • 问题内容: 这是我的standalone-full.xml配置,其中ssl配置了 security realm . Subsystem Socket Binding 问题答案: 重写规则可用于重定向用户。在undertow子系统(standalone.xml或domain.xml)中,你需要创建一个新的重写过滤器,然后在新的fitler-ref中启用该过滤器: 在过滤器部分中创建新的重写过滤器。在