使用.htaccess移除.php后缀后POST请求仅提交单行表格数据问题
解决POST表单仅提交单行数据的问题(.htaccess移除.php后缀引发)
看起来你的问题根源在于.htaccess里的重定向规则把POST请求转换成了GET,导致大部分表单数据丢失(你看到的单行数据可能是浏览器的特殊处理或个别字段的残留)。咱们一步步来修复:
修正后的.htaccess规则
DirectoryIndex index RewriteEngine on # 移除.php后缀,但跳过POST请求,避免重定向丢失数据 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ %1 [R,L,NC] # 内部补全.php后缀(支持include等场景) RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [NC,L] # 添加.html后缀(仅当对应.php和原始文件都不存在时执行) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}.php !-f RewriteRule ^([^.]+)$ $1.html [NC,L]
为什么原始规则会出问题?
你的第一条规则会对所有包含.php的请求(包括表单POST提交)执行外部重定向([R]标志)。举个例子:
当你提交表单到
your-domain/form.php时,服务器会返回302重定向到your-domain/form,而浏览器会自动把POST请求转换成GET请求来访问新地址——这直接导致POST表单数据丢失,只剩下个别可能被浏览器特殊处理的字段。
另外我给第三条规则加了额外判断,避免它和第二条.php重写规则冲突:只有当请求的文件本身不存在,且对应的.php文件也不存在时,才会添加.html后缀,防止误处理。
额外建议
把你的表单action属性改成不带.php的路径(比如action="form"),这样提交时直接发送POST请求到无后缀的地址,服务器内部重写到form.php,完全不会触发外部重定向,数据就能完整提交了。
内容的提问来源于stack exchange,提问作者Mohamad Hazim Johari
相关产品推荐
相关产品推荐

