我遇到了一些让我头疼的服务器请求问题。情况是,我的一些表单可以毫无问题地 POST 到服务器,但其他表单则从 HTTPS 重定向到 HTTP,重定向到相同的 URL,但采用 GET 请求,因此,当我的脚本收到请求时,没有 POST 数据。

我已经检查了我的 .htaccess,看起来没什么问题,但是,我也不明白为什么会导致这种情况(我承认我不是 Apache 超级明星)。

我添加了一个调试器来暂停应用程序的第一行代码,而此时的请求已经发生改变,这就是我来到这里的原因。

第一张图片显示了从页面发送的安全 POST 请求

第二张图片展示了不安全的重定向作为 GET 请求

我的.htaccess样子是这样的

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Redirect all HTTP requests to HTTPS
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Ensure the correct handling of index.php, site.php, and cp.php
    RewriteRule ^(index|site|cp)\.php$ - [L]
    RewriteRule ^(css|js|img)/ - [L]
    RewriteRule ^favicon.ico$ - [L]

    # Redirect all other requests to the appropriate PHP file
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [NC,L,QSA]
</IfModule>

如您所见,我有 3 个进入应用程序的入口点index.php,分别用于访客请求、site.php经过身份验证的用户和cp.php管理员(控制面板)。这些入口点有助于路由,并且非常相似(引导系统、身份验证、处理请求)。

我现在正在重写的表单是发生这种情况的第二个表单,除了动作属性之外,它们看起来相同。我尝试过使用和不使用 enctype,尝试过不同的浏览器,并且我重新启动并重建了 docker 容器来查找此问题的原因。

除了我构建的框架之外没有其他框架,这是原始的 PHP,但我认为我们可以看到这不是代码问题。

7

  • 主配置中可以有任何重定向或其他不平凡的事情吗?(顺便问一下,为什么根本 .htaccess而不是将其内容包含到<Directory>主配置中的适当块中?)


    – 


  • 您发布到某个 URL 后,立即重定向到不同方案下的相同路径。这看起来就像损坏的 PRG 模式。您应该在 php 代码中搜索header(调用并对其进行检测。


    – 

  • @NikitaKipriyanov 你说得对,我应该这么做。我以这种方式继承了这个项目,所以保留了它,再加上 95% 的表单帖子有效,而有些则无效,对我来说,这听起来并不是一件简单的事情


    – 

  • @symcbean 我在任何 PHP 代码运行之前就停止了执行,所以我认为这根本不是代码问题。请求发送到服务器,并在服务器级别立即重定向到 GET 版本。


    – 

  • 假设还有另一个(第二个)重定向回 HTTPS(通过 中的指令.htaccess)?如果没有,为什么没有?但如果有,为什么没有重定向循环(或者有)?初始 302 重定向的完整 HTTP 响应标头是什么?你看到Server标头了吗?当“浏览器”遇到 302 重定向时,“浏览器”(不是服务器)会将 POST 请求转换为 GET,并且 POST 数据自然会丢失 – 这是预期的行为。问题在于触发此 302 的位置 – 您发布的内容中没有任何内容可以在这方面提供帮助。(标Server可能会提供线索。)


    – 

0