POST 在 htaccess 指令后变为 GET

2022-01-04 00:00:00 post redirect get php .htaccess

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

I am hiding the php file extention using the below directives in Apache htaccess file

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 表单

I have a simple html form like this

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

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

And in my PHP page this is how I was earlier checking whether the form has been posted

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

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

But since I added the htaccess directives to hide the php filename extensionthe "POST" becomes "GET" and the above code never executes. Is there a good way to handle this? I know it is the internal redirect that causes this but is there an elegant way to handle this? I don't want to use the below method for obvious reasons

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

推荐答案

POST 没有变成 GET,这是由于你的第一个重定向规则:

POST doesn't become GET, it is due to your first redirect rule:

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

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

Which is catching a request with .php in it and redirecting to a URL without .php in it. You're looking at $_SERVER["REQUEST_METHOD"] after it has been redirected by this rule.

以这种方式修复:

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

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

i.e. don't redirect POST requests to avoid POST data getting lost.

相关文章