Laravel在反向代理后面路线

Phi*_*oss 12 apache routing reverse-proxy laravel laravel-5

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

这样,我就可以访问服务器了.

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

例如,我访问http://subdomain.test.com但是使用route()帮助程序生成的所有路由都显示以下url: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>
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试将所有路线封闭在一个Route::group(['domain' ...组中,这也不起作用.

小智 17

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

我有以下设计:

  • 客户端通过HTTPS与SSL负载均衡器进行通信
  • SSL负载均衡器通过HTTP与后端服务器通信

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

以下是一个快速的解决方法,使这项工作,包括架构(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);
}
Run Code Online (Sandbox Code Playgroud)

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

PROXY_URL = http://igateway.somedomain.com
Run Code Online (Sandbox Code Playgroud)

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

PROXY_SCHEMA = https
Run Code Online (Sandbox Code Playgroud)

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

if (!empty($proxy_schema)) {
    URL::forceScheme($proxy_schema);
}
Run Code Online (Sandbox Code Playgroud)


小智 9

转到 app/Http/Middleware/TrustProxies.php 并更改 protected 变量 $proxies,如下所示:

protected $proxies = ['127.0.0.1'];
Run Code Online (Sandbox Code Playgroud)

只是这个!要开心!

  • 这是现代的答案。请参阅 https://laravel.com/docs/5.8/requests#configuring-trusted-proxies (2认同)

小智 8

因为 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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

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


Phi*_*oss 6

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

Laravel似乎忽略了HTTP请求urlconfig\app.php文件中的属性(确实声明它仅适用于工匠),而是使用apache HTTP_HOSTSERVER_NAMEapache提供的为URL生成域。

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

URL::forceRootUrl('http://subdomain.newurl.com');
Run Code Online (Sandbox Code Playgroud)

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