繁体   English   中英

反向代理背后的 Laravel 路由

[英]Laravel routes behind reverse proxy

好的,出于开发目的,我们有一个专用的 Web 服务器。 它目前没有直接连接到互联网,所以我在另一台服务器上设置了一个 apache 反向代理,它转发到开发服务器。

这样,我就可以通过网络访问服务器。

问题是,Laravel 中的路由现在以内部服务器 IP 地址或服务器计算机名称作为前缀。

例如,我去http://subdomain.test.com但使用所产生的所有路线, route()帮手,是显示以下网址: http://10.47.32.22 ,而不是http://subdomain.test.com

反向代理设置如下:

<VirtualHost *:80>
    ServerName igateway.somedomain.com

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://10.47.32.22:80/
    ProxyPassReverse / http://10.47.32.22:80/
    <Location />
        Order allow,deny
        Allow from all
    </Location>
</VirtualHost>

我已经在config\\app.php设置了实际域名。

如何设置要在路由中使用的默认 URL? 我不希望它使用内部地址,因为这违背了反向代理的意义。

我已经尝试将我的所有路由都包含在Route::group(['domain' ... group, 这也不起作用。

当 Laravel 5 应用程序不知道位于 SSL 负载平衡器后面时,我遇到了相同(或类似的问题)。

我有以下设计:

  • 客户端通过 HTTPS 与 SSL 负载平衡器对话
  • SSL 负载平衡器通过 HTTP 与后端服务器通信

但是,这会导致 HTML 代码中的所有 URL 都使用 http:// 模式生成。

以下是使这项工作的快速解决方法,包括架构(http 与 https):

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

在最新版本的 Laravel 中,使用web/ 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);
}

好的,所以我明白了。 希望这会在将来对某人有所帮助。

Laravel 似乎忽略了 http 请求的config\\app.php文件中的url属性(它确实声明它仅适用于 artisan),而是使用 apache 提供的HTTP_HOSTSERVER_NAME来生成 URL 的域。

要覆盖此默认网址,请转到您的routes.php文件并使用以下方法:

URL::forceRootUrl('http://subdomain.newurl.com');

这将强制 URL 生成器使用新的 url 而不是 HTTP_HOST 或 SERVER_NAME 值。

转到 app/Http/Middleware/TrustProxies.php 并像这样更改受保护的变量 $proxies:

protected $proxies = ['127.0.0.1'];

只是这个! 要开心!

似乎 Laravel 有更方便的解决方案.. 检查那里的答案: How do I configure SSL with Laravel 5 after a load balancer (ssl_termination)?

在 App\\Providers\\AppServiceProvider 类中添加此代码

URL::forceRootUrl(Config::get('app.url'));
if (Str::contains(Config::get('app.url'), 'https://')) {
    URL::forceScheme('https');
}

因为 laravel 路由不是从config/app本身而不是从服务器创建的。 我的解决方案是将 proxy_set_header Host 添加到 nginx 的配置中。

server {
    listen 80;
    server_name my.domain.com;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host  my.domain.com;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8000;
    } 
}

我在机器上正在运行的 nginx 中使用 laravel 8 和 nginx docker,所以是的,它是双 nginx

跟进@TimeLord 的解决方案:

在最新版本的 laravel 中,强制模式的名称已更改,现在是: URL::forceScheme()

我知道这个话题很老,但我一直在通过替换我的 DatabaseSessionHandler.pdf [@Illuminate/Session] 中的以下行来解决这个问题:

    protected function ipAddress()
    {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
//        return $this->container->make('request')->ip();
    }

当然你需要先迁移会话表并设置配置
(.env 变量 SESSION_DRIVER=数据库)

对于 nginx,你不需要在 Laravel 中做任何额外的事情。 修复可以从 nginx 配置完成;

server {
    listen 80;
    listen [::]:80 ipv6only=on;

    server_name sub.domain.dev;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host  sub.domain.dev;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8000;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM