Laravel 5.4 URL末尾带斜杠时超时跳转至负载均衡IP问题求助
从你的描述来看,.htaccess的配置方式(手动移除URL中的public)确实是问题的核心诱因之一,再结合负载均衡的反向代理配置缺失,共同导致了带尾斜杠的URL出现超时和公网IP暴露的问题。下面一步步拆解原因和解决办法:
1. 为什么带尾斜杠的URL会出问题?
当URL末尾带斜杠时,Apache会默认将其识别为「目录请求」。如果你的.htaccess规则没有正确处理这类请求,再加上负载均衡没有传递原始请求的Host头,后端服务器在尝试重定向时会使用它直接感知到的IP(也就是负载均衡的公网IP 10.66.0.3)生成跳转链接,而不是你的域名www.mywebsite.com。同时,内部服务器可能无法直接访问这个公网IP,或者负载均衡没有配置对应的路由规则,最终导致连接超时。
2. 修正根目录的.htaccess配置
你没有将域名直接指向Laravel的public目录,而是通过.htaccess转发请求,这需要确保规则能正确处理尾斜杠、避免错误跳转。替换你的根目录.htaccess为以下内容:
<IfModule mod_rewrite.c> RewriteEngine On # 第一步:自动移除URL末尾的斜杠(301永久重定向,避免目录请求触发错误) RewriteRule ^(.*)/$ /$1 [L,R=301] # 第二步:将所有非文件/非目录的请求转发到public目录 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ public/$1 [L] </IfModule>
这个规则会先把带尾斜杠的URL重写为不带斜杠的版本,再转发到public目录,从根源上避免目录请求的错误跳转。
3. 修复负载均衡的反向代理配置
负载均衡器需要将原始请求的Host头传递给后端服务器,这样Apache和Laravel才能生成正确的域名链接,而不是用负载均衡的IP。
如果负载均衡是Apache:
在反向代理配置中添加:
ProxyPreserveHost On ProxyPass / http://192.168.10.1/ ProxyPassReverse / http://192.168.10.1/ # 同理添加第二台服务器的配置
ProxyPreserveHost On会让后端服务器拿到原始的www.mywebsite.com Host头,而不是负载均衡的IP。
如果负载均衡是Nginx:
在location /块中添加:
proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://your_backend_server_pool;
4. 调整Laravel和Apache的补充配置
- Laravel配置:打开
config/app.php,确保url参数设置为你的域名:
同时在'url' => env('APP_URL', 'https://www.mywebsite.com'),.env文件中设置APP_URL=https://www.mywebsite.com,让Laravel生成的所有URL都使用正确域名。 - Apache配置:在后端服务器的Apache站点配置中添加
UseCanonicalName Off,避免Apache强制使用服务器主机名生成跳转链接。
验证方案
修改配置后,重启后端Apache和负载均衡服务,然后测试:
- 访问
www.mywebsite.com/asdfa/,应该自动重定向到www.mywebsite.com/asdfa,然后跳转到404页面 - 访问
www.mywebsite.com/big-data-analytics/,应该自动重定向到不带斜杠的版本并正常加载页面
内容的提问来源于stack exchange,提问作者Jazzbot

