【问题标题】:Apache 301 Redirect and preserving post dataApache 301 重定向和保留帖子数据
【发布时间】:2012-11-17 16:57:26
【问题描述】:

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

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

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

有什么可以做的吗?

谢谢

【问题讨论】:

  • 实际上另一种解决方案,对我来说更好的是为表单和操作计算目标 SEO URL。额外的查询,但 URL 将被保留,并且不需要 301 重定向。

标签: apache rewrite http-post http-status-code-301


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 谢谢,我假设这样做可以使登录表单在浏览器 URL 栏中显示用户名/密码。我正在引导自己更新每个表单以发布到计算出的动态 SEO URL。
  • @DanielCook 如果重定向到同一个域 url 并且您不希望它们在 URL 中,您也可以将 POST 变量放在会话中。只是不要忘记在发出重定向之前强制刷新会话。我不认为 GET 参数会影响 URL 的 SEO,但它只会在视觉上很难看。
  • 谢谢,也许这会奏效。 Apache 将所有发布请求发送到“redirectPost.cfm”,这会将表单数据存储在 session.form 中并重定向 URL(丢失发布数据)。一旦 'redirect.cfm' 获取它,它会将所有 session.form 数据写回表单范围,然后再交付内容。
  • Doh,刚刚意识到重定向到“redirectPost.cfm”会丢失帖子数据。也许另一种类型的重定向,307?保留帖子数据,我将不得不查找。
  • @DanielCook 您不会重定向到您的重定向处理程序页面,您只需在该页面上执行一次重定向即可。没有 rediect 30x 保留 post 参数
【解决方案2】:

使用307 应该是exactly what you want

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

-Wikipedia

【讨论】:

  • 这行得通,您可以通过仅将 307 重定向应用于 POST 请求来保持 301 重定向的效率
  • @chrismarx 你是怎么做到的?
  • 我添加了这个:RewriteCond %{REQUEST_METHOD} =POST 然后在下一行,这个:RewriteRule /my-app/(.*)$ /$1 [R=307]
  • 是的,它也适用于我。但有些事情真的很奇怪:在完全相同的规则下,通过将 R=301 更改为 R=307,RewriteRule 的工作方式就不一样了!
  • 伙计,这真的节省了我潜伏的时间。只需向可能对 LaravelLumen 及其Redirect Trailing Slashes If Not A Folder 有问题的人添加一些关键字。此外,这个答案对于开发 API 的人特别有用。
【解决方案3】:

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

考虑使用 URL 重写工具,例如 Tuckey 的 URLrewriteFilter 或 apache mod_rewrite

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

【讨论】:

猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 2018-11-18
  • 2015-05-23
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多