POST在htaccess指令之后变为GET


POST becomes GET after htaccess directives

我在Apache htaccess文件中使用以下指令隐藏php文件扩展名

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s([^.]+)'.php [NC]
RewriteRule ^ %1 [R,L,NC]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]

我有一个简单的html表单,像这个

<form action="register.php" method="post">
  <input type="text" name="name">
  <input type="submit">
</form>

在我的PHP页面中,这是我之前检查表单是否已发布的方式

if ($_SERVER["REQUEST_METHOD"] == "POST") {
/* code to process the post */
}

但是,由于我添加了htaccess指令来隐藏php文件扩展名,"POST"变成了"GET",上面的代码永远不会执行。有什么好办法处理这个问题吗?我知道是内部重定向导致了这种情况,但有没有一种优雅的方法来处理这种情况?我不想使用下面的方法,原因很明显

if (isset($_POST['submit'])) {

POST不会变成GET,这是由于您的第一个重定向规则:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s([^.]+)'.php [NC]
RewriteRule ^ %1 [R,L,NC]

它捕获一个包含.php的请求,并重定向到一个不包含.php的URL。您看到的是$_SERVER["REQUEST_METHOD"]在被此规则重定向后

修复方式如下:

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s([^.]+)'.php [NC]
RewriteRule ^ %1 [R,L]

即不重定向CCD_ 6请求以避免CCD_。

可能有人对ajax调用有问题

在这种情况下,我有一个用[L,R]重写的规则。它必须只有[L],否则";POST变为GET;。