.htaccess隐藏PHP后缀配置是否影响内部Fetch API调用?
.htaccess规则对Fetch API请求的影响分析
问题背景
网站基于PHP构建,通过以下.htaccess规则隐藏URL中的.php后缀:
RewriteEngine on RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R]
调试异步表单处理时发现:Fetch API请求带.php后缀的URI时,表单数据无法传递到PHP处理程序;仅去掉后缀时才能正常工作。疑问是该规则是否导致了这一现象?
核心原因
这条规则确实会影响带.php后缀的Fetch请求,具体逻辑如下:
- 规则中的
R标志表示外部重定向,当请求带.php后缀的URL时,服务器会返回302/301状态码,引导客户端转向不带后缀的URL - 按照HTTP规范,Fetch API在遇到302重定向时,会自动将POST请求转为GET请求,而表单数据通常通过POST传递,这就导致数据在重定向过程中丢失
- 当请求不带后缀的URL时,服务器内部会映射到对应的PHP文件(若存在配套的内部重写规则或服务器默认配置),此时请求保持POST方法,数据能正常传递
解决方案建议
- 统一请求格式:让所有Fetch API请求都使用不带.php后缀的URI,避免触发重定向规则
- 调整.htaccess规则:修改规则,仅对浏览器的GET请求做重定向,忽略POST请求(比如Fetch的表单提交),同时补全内部重写逻辑,确保无后缀请求能正确映射到PHP文件:
RewriteEngine on # 仅对GET请求的.php URL执行外部重定向 RewriteCond %{REQUEST_METHOD} GET RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R] # 内部重写:将无后缀请求映射到对应.php文件(需确保文件存在) RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [NC,L]
内容的提问来源于stack exchange,提问作者Paeon
相关产品推荐
相关产品推荐

