.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
相关产品推荐
相关产品推荐

