Laravel环境Nginx反向代理Apache时路由参数丢失问题求助
解决Nginx+Apache反向代理下Laravel路由参数丢失的问题
你的问题根源很清晰:当前Nginx配置只对带.php后缀的请求做代理,而Laravel的友好URL(比如/hello)会被try_files重写到/index.php,此时代理到Apache的请求路径变成了/index.php,完全丢失了原始的路由信息。下面是兼顾静态文件Nginx直处理、PHP请求代理且保留路由参数的解决方案:
修正后的Nginx配置
server { listen 80; server_name application.test www.application.test; root /home/vagrant/application/public; index index.php index.html; # 静态资源由Nginx直接处理,提升性能 location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, max-age=31536000, immutable"; access_log off; # 关闭静态资源访问日志,减少磁盘占用 } # 处理所有非静态文件请求 location / { # 先检查文件/目录是否存在,存在则直接返回;不存在则代理到Apache try_files $uri $uri/ @proxy_to_apache; } # 专门的代理配置块,传递完整请求信息给Apache location @proxy_to_apache { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关键:传递原始请求URI,确保Laravel能拿到正确的路由路径 proxy_set_header X-Request-URI $request_uri; } # 处理直接访问.php文件的请求(比如手动访问/index.php) location ~ \.php$ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 禁止访问隐藏文件 location ~ /\. { deny all; access_log off; log_not_found off; } }
配置说明
- 静态资源独立处理:通过匹配常见静态文件后缀,让Nginx直接返回这些文件,不需要经过Apache,大幅提升静态资源加载速度,同时设置了长期缓存策略减少重复请求。
- 非静态请求直接代理:不再把友好URL重写到
/index.php,而是直接将原始请求(比如/hello)代理到Apache,让Apache的.htaccess规则来处理前端控制器的转发逻辑。 - 完整传递请求信息:通过
X-Request-URI $request_uri头,确保Apache能获取到用户的原始请求路径,Laravel的路由系统就能正确识别/hello这类路径并匹配对应的路由。
验证步骤
- 执行
sudo nginx -t检查配置文件语法是否正确; - 若配置无误,执行
sudo service nginx reload重新加载Nginx配置; - 访问
http://mydomain.test/hello,此时路由参数应该能被Laravel正确识别了。
你的Apache配置和.htaccess文件都是没问题的,不需要修改。
内容的提问来源于stack exchange,提问作者JonnySerra
相关产品推荐
相关产品推荐

