gpt4 book ai didi

在 AWS Elastic Beanstalk 中部署后浏览 https 时,Laravel Assets 、路由和 url() 不起作用

转载 作者:行者123 更新时间:2023-12-02 18:34:35 24 4
gpt4 key购买 nike

我使用 AWS elastic beanstalk 来部署我的 laravel 项目。一切正常,但我的 Assets 、路由无法获取真实用户 ip。

Assets:尽管我浏览 https,但它在调用 asset() 时引用了 http。从 https 读取 http Assets 的站点 block

路由:虽然我浏览https,但始终指向http

URL:虽然我浏览https,但总是返回http

IP:始终返回服务器 IP。永远不要获得真实的用户 IP。但它适用于其他服务器但不适用于 AWS elastic beanstalk

我该怎么办?欢迎任何解决方案,我们将不胜感激。

最佳答案

使用 AWS 或任何其他云负载均衡器时的两个常见问题:

  1. HTTPS(Laravel Assets 和路由):您应用了 SSL/TLS 并且 URL 在浏览器中受到保护,但 Laravel 不会加载您的 Assets 并引发错误。该错误看起来像是阻止了 URL,因为您正在尝试加载 http URL http 请求。大多数人在使用 AWS 或任何其他云负载均衡器 时都会遇到这个问题。在终止 TLS/SSL 证书的负载均衡器后面运行您的应用程序时,您可能会注意到您的应用程序在使用 url 帮助程序时有时不会生成 HTTPS 链接。这通常是因为您的应用程序正在从端口 80 上的负载均衡器转发流量,并且不知道它应该生成安全链接。

  2. IP:另一个问题是IP问题。您无法获取用户/访客 IP,它始终返回服务器 IP。此问题也会因 代理 而发生。

解决方案:当您使用 AWS 或任何云负载均衡器 时,您可能不知道实际 Loads Balancer 的确切 IP 地址所以应该允许所有代理,如下例所示。

使用 * 允许信任您的 TrustProxies 中间件中的所有代理。这是您的中间件 app/Http/Middlewares/TrustProxies.php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var string|array
*/
protected $proxies = '*';

/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO;

如果您使用的是 AWS Elastic Load Balancing,您的 $headers 值应该是 Request::HEADER_X_FORWARDED_AWS_ELB。 有关 $headers 属性中可能使用的常量的更多信息,请查看 Symfony 的文档在 trusting proxies .

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string
*/
protected $proxies = '*';

/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;

我认为它可以解决您的 HTTPS、IP 和其他与代理相关的问题。要阅读更多详细信息,请阅读 Laravel doc .

解决方案 2:还有另一种允许 https 的方法,方法是强制加入您的 AppServiceProvider 或创建一个新的中间件来实现它。在我的代码片段中,我决定使用 AppServiceProvider 因为易于实现。在任何文本编辑器中打开 app/Providers/AppServiceProvider.php 并编写 $this->app['request']->server->set('HTTPS', true);。您可以在生产模式下额外检查该 APP。

if(request()->getRequestUri() != '/health' && $this->app->environment('production')) {
$this->app['request']->server->set('HTTPS', true);
}

request()->getRequestUri() != '/health' 用于AWS ALB安全组的健康检查,因为它不支持https。

  1. 您可以使用 URL::forceScheme('https') 将 Assets url 强制为 https。

最后的解决方案 2 和 3 仅适用于 Assets 、https 和 url(),但不适用于真实 IP。所以我建议使用第一个解决方案,因为它适用于所有情况。如果您不想允许代理,那么解决方案 2 是最有效的。

如果您遇到任何其他问题或需要改进,请在下方发表评论。

祝你好运。享受吧!

关于在 AWS Elastic Beanstalk 中部署后浏览 https 时,Laravel Assets 、路由和 url() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68964382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com