You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

配置说明

  1. 静态资源独立处理:通过匹配常见静态文件后缀,让Nginx直接返回这些文件,不需要经过Apache,大幅提升静态资源加载速度,同时设置了长期缓存策略减少重复请求。
  2. 非静态请求直接代理:不再把友好URL重写到/index.php,而是直接将原始请求(比如/hello)代理到Apache,让Apache的.htaccess规则来处理前端控制器的转发逻辑。
  3. 完整传递请求信息:通过X-Request-URI $request_uri头,确保Apache能获取到用户的原始请求路径,Laravel的路由系统就能正确识别/hello这类路径并匹配对应的路由。

验证步骤

  1. 执行sudo nginx -t检查配置文件语法是否正确;
  2. 若配置无误,执行sudo service nginx reload重新加载Nginx配置;
  3. 访问http://mydomain.test/hello,此时路由参数应该能被Laravel正确识别了。

你的Apache配置和.htaccess文件都是没问题的,不需要修改。

内容的提问来源于stack exchange,提问作者JonnySerra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:12:32