【问题标题】:POST becomes GET after htaccess directives在 htaccess 指令之后 POST 变为 GET
【发布时间】:2016-01-02 11:51:11
【问题描述】:

我在 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'])) {

【问题讨论】:

  • 我无法复制您描述的问题-
  • 我想复制它应该不难。您需要将第一块规则放入您的 htaccess 文件中。然后使用第二个代码块创建一个 php 页面,并在 html 表单代码的上方使用 REQUEST_METHOD 放入我的第三个代码块 - 并在 IF 条件下放入警报或控制台消息。您可以看到它不会触发,因为它期待来自服务器的回复 (POST),但由于重定向而获得了 GET。

标签: php .htaccess redirect post get


【解决方案1】:

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 数据丢失。

【讨论】:

  • 我确实提到“我知道是内部重定向导致了这种情况”,但如果我不进行重定向,那么链接将显示为 myapp.example.com/register.php(我不想显示我所有页面的扩展名)。为某些页面显示页面扩展名而不为其他页面显示页面扩展名很奇怪。谢谢
  • 不,它不是内部重定向,它是一个外部重定向,它会导致从浏览器向网络服务器发出一个新的 GET 请求。 POST 请求不应被重定向,否则您将丢失所有 POST 数据。要隐藏.php,您只需将action 参数更改为:&lt;form action="register" method="post"&gt;
  • 很酷,谢谢,它无需更改操作参数即可工作,因为提交后它是一个 GET 请求,因此扩展程序无论如何都不会显示 :-)
【解决方案2】:

也许有人对 ajax 调用有问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多