【问题标题】:Laravel routes behind reverse proxy showing wrong url反向代理后面的 Laravel 路由显示错误的 url
【发布时间】:2019-08-11 04:36:15
【问题描述】:

我正在将我的应用程序迁移到新主机。 我现在面临着网址的问题。 例如,当我访问 www.mydomain.be/public/dashboard 时,应用会重定向到 myservername.azurewebsites.net/public/dashboard。

一位同事向我指出“反向代理背后的 Laravel 路由”,但这对我不起作用。 我用谷歌搜索并尝试了以下方法:

在 Middleware\TrustProxies.php 中

protected $proxies = [
        '**'
    ];

在.env中

PROXY_URL = http://www.mydomain.be/public/
PROXY_SCHEMA = https

在路由/web.phpp中

    $proxy_url    = getenv('PROXY_URL');
$proxy_schema = getenv('PROXY_SCHEMA');
if (!empty($proxy_url)) {
    URL::forceRootUrl($proxy_url);
}

if (!empty($proxy_schema)) {
    URL::forceScheme($proxy_schema);
}

我也尝试在 routes/web.php 中使用

URL::forceRootUrl('https://www.mydomain.be/public');

但没有什么可以解决在 url-balk 中显示 myservername.azurewebsites.net/public/ 的事实。

【问题讨论】:

  • 您正在重定向,您没有进行代理,因此任何假设您正在代理的解决方案都将不起作用,因为您正在重定向。解决方案是代理连接,例如当有人连接到托管www.mydomain.be 的服务器时,服务器 连接到 myservername.azurewebsites.net 转发所有请求信息并将响应传输回客户端。客户永远不应该知道这已经发生了。所有主要的网络服务器都有能力做到这一点,例如apache有mod_proxymod_proxy_http
  • 所以我不必在 laravel 中更改某些内容,但必须更改服务器设置?
  • 在 Laravel 中,您仍然需要修改受信任的代理以信任传入的连接,但除此之外不需要任何其他更改。但是,无论您使用哪种方法,您都应该知道如何设置 forwarded headers,并相应地修改 TrustProxies 中的 $headers 属性。

标签: php laravel laravel-5.8


【解决方案1】:

在这里使用 laravel URL 外观和 forceRootUrl 方法(在 laravel 7.1 上工作)

将此行添加到 AppServiceProviderboot 会合

URL::forceRootUrl('http://localhost/proxy/');

【讨论】:

    【解决方案2】:

    以下是实现此工作的快速解决方法,包括架构(http 与 https):

    将以下代码放在app/Http/routes.php之上

    $proxy_url    = getenv('PROXY_URL');
    $proxy_schema = getenv('PROXY_SCHEMA');
    
    if (!empty($proxy_url)) {
       URL::forceRootUrl($proxy_url);
    }
    
    if (!empty($proxy_schema)) {
       URL::forceSchema($proxy_schema);
    }
    

    然后将以下行添加到 .env 文件中:

    PROXY_URL = http://igateway.somedomain.com
    

    如果您还需要将生成的 HTML 代码中的架构从 http:// 更改为 https://,只需添加以下行:

    PROXY_SCHEMA = https
    

    在最新版本的 laravel forceSchema 方法名称已更改为 forceScheme,上面的代码应如下所示:

    if (!empty($proxy_schema)) {
        URL::forceScheme($proxy_schema);
    }
    

    希望对你有所帮助。 source

    【讨论】:

    • 感谢您的回复。但我已经没有运气了。问题依然存在。
    • 请注意,getenv() 不适用于 Laravel 5.8,您应该使用 env()
    • 改变了它。但仍然没有变化。
    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2020-11-30
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多