htaccess指令后POST变成了GET

3
我正在使用以下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'])) {

我无法复制您所描述的问题。 - Professor Abronsius
我想复制它应该不难。你需要将第一个规则块放入你的htaccess文件中。然后创建一个带有第二个代码块的php页面,并在html表单代码之前插入我的第三个代码块,其中包含REQUEST_METHOD - 只需在IF条件中添加一个警报或控制台消息即可。你会发现它不会触发,因为它期望从服务器获得回复(POST),但由于重定向而得到了GET。 - R.W
2个回答

3

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]

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

我确实提到了“我知道是内部重定向导致了这个问题”,但如果我不进行重定向,那么链接将显示为https://myapp.example.com/register.php(而我更喜欢不为所有页面显示扩展名)。对于某些页面显示页面扩展名而对于其他页面不显示扩展名是很奇怪的。谢谢。 - R.W
不,这不是“内部重定向”,而是外部重定向,它会导致浏览器向Web服务器发出新的GET请求。否则,如果重定向POST请求,您将丢失所有POST数据。要隐藏“.php”,您只需更改“action”参数,如下所示:**<form action="register" method="post">**。 - anubhava
1
太棒了,不需要更改操作参数就可以工作了,因为提交后它是一个GET请求,所以扩展程序不会出现 :-) - R.W

0

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

在这种情况下,我使用了[L,R]的重写规则。它必须只是[L],否则“POST变成GET”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接