在htaccess指令之后,POST变为GET

时间:2016-01-02 11:51:12

标签: php .htaccess redirect post get

我使用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文件扩展名&#34; POST&#34;成为&#34; GET&#34;以上代码永远不会执行。有没有一个好方法来处理这个?我知道这是导致这种情况的内部重定向,但有一种优雅的方式来处理这个问题吗?我出于显而易见的原因,我不想使用以下方法

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

2 个答案:

答案 0 :(得分:2)

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

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

其中包含.php的请求,并重定向到其中没有.php的网址。在您按照此规则重定向后,您正在查看$_SERVER["REQUEST_METHOD"]

要解决这个问题:

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

即。不要重定向POST请求,以避免POST数据丢失。

答案 1 :(得分:0)

也许有人遇到了ajax调用的问题。

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