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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:23:11