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

.htaccess移除扩展名致PHP表格上传失败,求解决方案

问题根源

你的.htaccess规则会将所有带.php扩展名的请求(包括POST表单提交)重定向到无扩展名的URL,而POST请求经过重定向后会自动转为GET请求,导致上传的文件和POST数据全部丢失,所以后端代码检测不到$_POST['file_submit']和$_FILES变量,直接触发nofile错误。

具体来说,表单提交到php/import.php时,第一条Rewrite规则匹配到请求中的.php,发起3xx重定向到php/import,浏览器会用GET请求访问这个新URL,原POST数据和上传文件完全丢失。

解决方案

以下三种方法任选其一即可:

方法1:禁止POST请求触发重定向(推荐)

在.htaccess的两条重定向规则(处理.php和.html的)前添加条件,仅对GET请求执行重定向,POST请求直接跳过:

RewriteEngine on

# 仅对GET请求重定向.php到无扩展名
RewriteCond %{REQUEST_METHOD} !=POST [NC]
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

# 仅对GET请求重定向.html到无扩展名
RewriteCond %{REQUEST_METHOD} !=POST [NC]
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L] 

方法2:单独排除上传处理脚本

如果你只想针对这个上传功能做修改,可以在.php重定向规则前添加排除条件,让php/import.php不被重定向:

RewriteEngine on

# 排除import.php的重定向
RewriteCond %{REQUEST_URI} !/php/import\.php [NC]
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

# 其余规则保持不变
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L] 

方法3:修改表单提交地址为无扩展名URL

直接把表单的action属性改成无扩展名的路径,让表单直接POST到重定向后的目标URL,避免触发重定向:

<form action="php/import" method="post" enctype="multipart/form-data">
    <!-- 表单其余内容不变 -->
</form>

内容的提问来源于stack exchange,提问作者Just Leave it Blank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:45:39