36

我已经使用 Apache 301 重定向到网站根目录中的“redirect.cfm”实现了 SEO URL,该网站处理所有 URL 构建和内容交付。

Post 数据在 301 重定向期间丢失。

到目前为止无法找到解决方案,已尝试从重写中排除 post 方法 - 最坏的情况是我们可以将旧类型的 URL 用于 post 方法。

有什么可以做的吗?

谢谢

4

3 回答 3

72

使用 a307应该正是你想要的

307 Temporary Redirect (since HTTP/1.1)
In this case, the request should be repeated with another URI; however, future requests
should still use the original URI.[2] In contrast to how 302 was historically implemented,
the request method is not allowed to be changed when reissuing the original request. For
instance, a POST request should be repeated using another POST request

-维基百科

于 2014-02-17T05:10:54.653 回答
32

大约 2021 年更新 这里的原始答案是在307状态代码重定向在浏览器中一致工作之前编写的。根据下面 Hashbrown 的回答,307应该使用状态码。

旧答案 POST 数据在重定向时被丢弃,因为客户端将对 301. 期间指定的 URL 执行 GET 请求。

唯一的选择是将 POST 参数转换为 GET 参数并将它们附加到您要重定向到的 URL 的末尾。这不能在 .htaccess 文件重写中完成。

一种选择是捕获对要重定向的 url 的 POST 请求,并将其传递给页面以处理重定向。您需要在代码中对参数进行转置,然后以这种方式发出带有参数附加新 url 的重定向标头。

更新:正如此答案的评论中所指出的,如果您确实重定向到另一个指定 POST 参数的 URL,并且该 URL 也可以在没有参数的情况下访问(或者参数是可变的),您应该指定一个指向该页面的规范 URL 的链接.

假设 POST 表单重定向到以下 GET 资源:

   http://www.example.com/finalpage.php?form_data_1=123&form_data_2=666

您可以将此链接记录添加到页面的 head 部分:

   <link rel="canonical" href="http://www.example.com/finalpage.php" />

这将确保将所有 SEO 值赋予http://www.example.com/finalpage.php并避免重复内容可能出现的问题。

于 2012-11-29T15:18:27.007 回答
-1

使用 301 重定向进行一般 URL 重写不是可行的方法。这是一个性能问题(尤其是对于移动设备,但通常也是如此),因为它会使您页面的请求数量增加一倍。

考虑使用像 Tuckey'sURLrewriteFilter或 apache这样的 URL 重写工具mod_rewrite

雷所说的都是真的,这只是对您的一般方法的补充评论。

于 2013-06-19T12:19:43.417 回答