【问题标题】:redirectmatch changes post to getredirectmatch 更改帖子以获取
【发布时间】:2012-05-22 03:23:01
【问题描述】:

我有两个独立的虚拟主机。在万维网。一,我在 .htaccess 上安装了这一行

redirectMatch 301 ^(.*)$ http://d_blur_blur_s.com$1

除了将 POST 转换为 GET 的情况外,一切都按预期工作。
请注意,该帖子具有参数作为获取(我没有这样做,也不会更改它)我只是想避免重复的内容。我正在显示萤火虫踪迹。

我希望通过 redirectmatch 或其他技巧将 POST 重定向到主域。

更新
我在网站上有一半的内部链接是用 www 写的,另一半没有。所以我需要保持公开但不重复。我需要将 GET 作为 GET 转发,将 POST 作为 POST 转发。问题很大,我有 12000 页索引,还有很多表格。所以我首先在不更改代码的情况下寻找通用解决方案。我完全控制服务器。

非常感谢

【问题讨论】:

    标签: .htaccess redirect


    【解决方案1】:

    您使用 307 而不是 301 进行重定向来保留帖子数据,但是如果用户确定要发送帖子数据,一些浏览器会向用户显示一个对话框,因此并不漂亮。

    但我宁愿从根本上解决问题。如果 html-form 引用了错误的域(例如<form action="www.d_blur_blur_s/public/main/loginGenerator.php" ...),您会得到一个错误域的帖子的唯一方法。只需修复 html。

    不必担心重复的内容,因为搜索引擎从不发送后期请求,只会获取。您当前的解决方案应该可以防止重复内容。

    【讨论】:

    • 这是对的,但是我现在不想碰三方应用程序
    • 太棒了!在我看到这个之前,我非常担心我的 webhook 处理器服务能够使用通配符子域前缀。谢谢一百万!
    • 那么如果在 Apache RewriteRule 中执行 R=307 而不是 R=301 POST 请求将不会转换为 GET 请求?
    • @NathanB 是的。这就是我所说的。来自MDN websiteThe only difference between 307 and 302 is that 307 guarantees that the method and the body will not be changed when the redirected request is made.
    【解决方案2】:

    无论是 POST 还是 GET 请求,服务器对您发出的任何请求的重定向响应始终会导致您的客户端发出 GET 请求(除非您以某种方式使其不会自动跟随重定向——有时我会这样做使用 curl,但我不知道任何广泛使用的具有此功能的浏览器可以轻松地提供给用户)。客户端浏览器获取重定向提供的 URL 并将其视为 URL 以执行 GET 请求。没有办法,POST 数据被服务器丢弃,因为它是为原始 URL 上的服务器资源准备的。

    如果您在 .htaccess 之外重定向,例如在 PHP 文件中构建重定向响应,您唯一的选择是将 POST 参数转换为 GET 参数字符串并将其添加到您发送回的 URL 的末尾客户端与您的重定向响应。

    我相当有信心,无论您使用重定向指令还是通过 mod_rewrite 模块的重写指令,都无法在 .htaccess 文件或 httpd.conf 文件中执行自动 POST 参数附加到重定向。

    【讨论】:

      【解决方案3】:

      进行重定向和保留 POST 数据的唯一方法(据我所知) 是将 mod_rewrite 与 mod_proxy 结合使用,然后在 RewriteRule 中使用 P 标志。

      在您的www 主机上通过httpd.conf 启用mod_rewrite、mod_rewrite 和.htaccess,然后将此代码放入您的.htaccess 下的DOCUMENT_ROOT 目录:

      Options +FollowSymLinks -MultiViews
      # Turn mod_rewrite on
      RewriteEngine On
      RewriteBase /
      
      RewriteRule ^ http://d_blur_blur_s.com%{REQUEST_URI} [P]
      

      【讨论】:

      • 我不想使用 mod_rewrite,因为它会“生成”重复的内容
      • 重复内容?世界各地的 Apache 安装 mod_rewrite 正是出于这个原因,即避免重复内容。
      • 您提出的配置,在普通域和 www 子域上都响应内容,两者都响应相同的内容,因此是重复的内容
      • 当您使用代理时,目标 URL 即 http://d_blur_blur_s.com/something 将永远不会暴露给您的浏览器或搜索引擎,因此不会导致任何重复的内容。浏览器或搜索引擎现在只会使用您原来的www URL。
      • 很抱歉回来晚了。仅 .htaccess 无法完全满足您的需求。我相信您会使用某种 Web 框架,例如 Wordpress、Joomla 等,为您的所有页面提供通用页脚功能。您可以首先在 .htaccess 中使用我上面的代码将 POST 数据获取到所需的域并在那里进行所有处理。稍后在您的页脚中,您可以通过代码(如 PHP 中的 header 函数)执行条件 301 redirect 以从搜索引擎中删除重复项。然而,这需要一些你试图避免的编码。
      【解决方案4】:

      我也碰到了这个 POST->GET 重写。像这样的 API 调用:

        curl -X POST https://example.com/api/user/123456789
      

      正在使用 GET 请求方法进入我的 API 框架。

      原因似乎与正文为空的 POST 请求有关。为避免此问题,您可以设置 Content-Length 标头:

        curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0'
      

      或在体内传递一些东西:

        curl -X POST https://example.com/api/user/123456789 -d ''
      

      【讨论】:

        【解决方案5】:

        在 HTTP 1.1 中,statusCode (307) 表示应使用相同的方法重复请求并发布数据。更改重定向类型以修复它。

        【讨论】:

        • 但是RewriteRule应该怎么修改呢?
        • @NathanB 在重定向标志上,使用[R=307]
        【解决方案6】:

        将 www 添加到基本 URL 对我来说是这样。

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2019-09-26
        • 2010-10-28
        • 2014-06-27
        • 2021-10-24
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        相关资源
        最近更新 更多