移除.php/.html后缀后PHPMailer无法工作的解决方法求助
解决.htaccess移除后缀后PHPMailer失效的问题
核心原因
表单提交到email.php时,你的.htaccess规则会把带.php的请求重定向到无后缀URL(比如/email),而POST请求重定向后会转为GET请求,导致$_POST['send']无法被检测到,PHPMailer的发送逻辑根本没触发。
可行修复方案
方案1:修改表单的action路径
直接把表单的action改为无后缀地址,避免触发重定向:
<form class="center_absolute display_grid row_gap_1_rem" action="email" method="post">
提交时直接请求/email,会被重写规则映射到email.php,POST参数完整保留,逻辑正常执行。
方案2:修改.htaccess规则,排除POST请求或特定文件
如果不想修改表单,可调整规则让POST请求不被重定向:
RewriteEngine on # 处理.html后缀 RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] RewriteCond %{REQUEST_METHOD} !=POST RewriteRule ^ /%1 [NC,L,R] RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^ %{REQUEST_URI}.html [NC,L] # 处理.php后缀 RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteCond %{REQUEST_METHOD} !=POST RewriteRule ^ /%1 [NC,L,R] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [NC,L]
添加RewriteCond %{REQUEST_METHOD} !=POST后,POST请求不会被重定向,表单提交到email.php时能直接处理。
也可以单独排除email.php不被重定向:
RewriteEngine on # 处理.html后缀 RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] RewriteRule ^ /%1 [NC,L,R] RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^ %{REQUEST_URI}.html [NC,L] # 处理.php后缀,排除email.php RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteCond %{REQUEST_URI} !/email\.php [NC] RewriteRule ^ /%1 [NC,L,R] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [NC,L]
方案3:优化.htaccess规则(可选)
你的规则重复写了RewriteEngine on,可合并并优化:
RewriteEngine on # 移除.html后缀的永久重定向(仅GET请求) RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] RewriteCond %{REQUEST_METHOD} !=POST RewriteRule ^ /%1 [NC,L,R=301] # 无后缀请求映射到.html RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^ %{REQUEST_URI}.html [NC,L] # 移除.php后缀的永久重定向(仅GET请求) RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteCond %{REQUEST_METHOD} !=POST RewriteRule ^ /%1 [NC,L,R=301] # 无后缀请求映射到.php RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [NC,L]
添加R=301明确使用永久重定向,对SEO更友好。
额外检查点
- 确认
email.php里PHPMailer的引入路径(当前./PHPMailer/...相对路径不受重写规则影响,可正常使用)。 - 测试时可在
email.php开头加var_dump($_POST);,查看是否能接收到表单参数,验证修复效果。
内容的提问来源于stack exchange,提问作者arche
相关产品推荐
相关产品推荐

