从IIS迁移至Apache后Htaccess配置异常:URL结尾带点时参数丢失
解决Apache .htaccess中URL末尾句点丢失的问题
我刚好碰到过类似的IIS转Apache的迁移坑,这个问题本质是Apache的默认行为在搞鬼——它继承了Unix文件系统的特性,会自动截断URL路径末尾的句点(Unix里文件名末尾的点没有实际意义),但Windows系统允许路径或文件名末尾带点,所以迁移后就出现了不兼容的情况。
核心解决思路:用原始请求URI替代RewriteRule捕获组
你当前的规则用(.+)$来捕获路径,但Apache在匹配规则之前就已经把末尾的点去掉了,所以自然捕获不到。我们可以直接用Apache提供的%{REQUEST_URI}变量,它保存了客户端发送的原始请求路径,完完整整包含末尾的句点。
修改后的.htaccess规则如下:
RewriteEngine on RewriteBase / # 跳过实际存在的文件和目录,避免静态资源被重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 传递原始请求路径给index.php,NE标志防止特殊字符被二次编码 RewriteRule ^ index.php?page=%{REQUEST_URI} [L,NE]
小优化:去掉路径开头的斜杠
上面的规则会把/test.传递成page=/test.,如果你的PHP代码期望拿到不带开头斜杠的test.,可以在PHP里加一行简单处理:
$page = isset($_GET['page']) ? ltrim($_GET['page'], '/') : '';
要是想在.htaccess里直接处理掉开头的斜杠,也可以用正则替换:
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 用正则提取去掉开头斜杠的路径 RewriteRule ^ index.php?page=%{REQUEST_URI:/(.*)/$1} [L,NE]
别忘了检查NGINX配置!
因为你的环境是Windows Server + NGINX + Apache,还要确保NGINX在转发请求给Apache时没有修改原始URI。在NGINX的location配置里,一定要保留完整的请求路径:
location / { proxy_pass http://你的Apache后端地址; # 替换成你的Apache实际地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 关键:确保传递原始请求URI,包括末尾的句点 proxy_pass_request_uri on; }
这样调整之后,访问/test.就能正确把test.(或/test.,取决于你选的规则)传递到index.php了,而/te.st的正常访问完全不受影响。
内容的提问来源于stack exchange,提问作者Rodney
相关产品推荐
相关产品推荐

