Laravel $request->input()线上环境路径与查询参数名合并问题如何解决?
问题根因
- 该问题是线上Web服务器(Nginx/Apache)的重写/重定向规则配置错误导致的,和二级域名本身无关。本地开发用的Laravel内置serve、集成环境默认带了正确的重写规则,所以不会出现异常。
- 出现参数名和路径拼接的核心原因是:Web服务器没有正确拆分
请求路径和查询字符串,把/items/getAll?cid整个当成了参数键,后面的33当成了参数值传给了Laravel的Request对象。
修复步骤
1. 修正Nginx配置(最常见场景)
检查站点配置的location段,确保try_files规则和官方要求一致,正确携带查询参数:
location / { try_files $uri $uri/ /index.php?$query_string; }
如果配置了HTTP强制跳转HTTPS,确保跳转规则保留查询参数:
# 错误写法(会丢失/拼错参数) # rewrite ^/(.*)$ https://subdomain.domain.com/$1 permanent; # 正确写法 rewrite ^/(.*)$ https://subdomain.domain.com/$1$is_args$args permanent;
修改配置后重启Nginx生效。
2. 修正Apache配置
检查站点根目录下public文件夹中的.htaccess文件,确保RewriteRule携带QSA标记(Query String Append,追加查询字符串),官方默认配置参考:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L,QSA] </IfModule>
修改后重启Apache生效。
3. 临时兜底方案(不需要改服务器配置)
如果暂时没法修改服务器配置,可以在控制器中手动解析请求URI获取参数:
// 解析完整请求URI $uri = $_SERVER['REQUEST_URI']; $queryStr = parse_url($uri, PHP_URL_QUERY); parse_str($queryStr, $queryParams); $chosen_category = $queryParams['cid'] ?? 0;
内容的提问来源于stack exchange,提问作者Annity
相关产品推荐
相关产品推荐

