【问题标题】:How can I detect if page was requested via a redirect?如何检测页面是否通过重定向请求?
【发布时间】:2009-07-24 15:25:19
【问题描述】:

在客户的网站上,有大量重定向到特定页面。这个页面需要有一种方法来检测请求是直接的(手动输入的 URI)还是重定向。

  1. 所有重定向都是 301 重定向。由于 SEO 规则需要避免添加指标。 (Google 分别用值索引 url)

  2. 我已尝试检查所有环境变量,但它们都是空的(假设是正常的),在这方面内部重定向没有任何不同(我认为)。

  3. 检测需要实时进行,因此不能选择日志文件。

流程简而言之,通过脚本将参数注册到cookies中,然后301重定向到内容为cookie驱动的页面。注册 cookie 后,当有人在地址栏中重新键入地址时,内容不会变回原始内容。

我希望这是有道理的。

以前:我在考虑状态代码,但我不确定是否有办法在目标页面上读取它。 (我们已经明确它不会起作用)

【问题讨论】:

  • 这与Web服务器发送给客户端的状态码无关。当客户端请求作为重定向目标的页面时,该代码已消失。
  • 是的。我怕你会这么说。 :)

标签: http redirect header


【解决方案1】:

这是我最近为检测重定向并将其作为自定义请求标头公开给应用程序所做的:X-Redirect: 1(使用 Apache 的 mod_rewrite 和 mod_headers)。

在源端,我通过在 URL 路径前附加一个 /redirect 将所有请求重定向到目标服务器:

RewriteRule ^/(.*) http://target-server.com/redirect/$1 [L,R=permanent]

在目标端,我检测到路径中的/redirect,通过另一个重定向将其剥离,并将自定义 cookie 注入响应:

RewriteRule ^/redirect/(.*)$ /$1 [R=permanent,L,CO=redirect:1:target-server.com:86400:/]

同样在目标端,我将 cookie 转换为环境变量,“禁用”cookie,然后将 env 变量转换为自定义请求标头:

RewriteCond %{HTTP_COOKIE} redirect=1 [NC]
RewriteRule ^(.*)$ /$1 [L,CO=redirect:0:target-server.com:86400:/,E=redirect:1]
RequestHeader set X-Redirect 1 env=redirect

【讨论】:

    【解决方案2】:

    怎么样:

    my $cgi = CGI->new;
    
    print $cgi->redirect(
        'http://example.com/this/page/that.html?redirect=yes'
    );
    

    您使用什么机制来区分重定向然后可以查看查询字符串来决定。当然,这并不妨碍用户使用redirect=yes 等为网址添加书签。

    您可以尝试 referer 标头,但这有其自身的问题。

    【讨论】:

    • 当然,如果他们可以更新所有请求以包含一个已知的查询字符串会有所帮助,但正如您所指出的,如果用户将该 URL 加入书签或更糟糕的情况下仍然链接到它,您需要检查别的东西(比如引用信息 - 并检查内容,而不仅仅是它存在)
    • @Zhaph:想法是拦截请求并对其进行转换。即使他们尝试获取旧 URL,他们仍然会被重定向到额外的信息。如果您正在寻找链接到该 URL 的应用程序部分,则日志文件分析和 grep 之类的东西可以提供帮助。 :)
    【解决方案3】:

    我认为没有办法做到这一点。我能想象的唯一指标是Referer header field。但似乎只有在请求以非 HTTP 方式发起时才会发送(单击链接、表单提交、元刷新等)。

    【讨论】:

    • 好吧,证明我不是这样,Mr. Down-Vote。
    • 我的意思是,如果发生重定向,您似乎没有获得推荐人是对的。
    【解决方案4】:

    根据浏览器和中间代理,可能会发生几件事。但是,在大多数情况下,您不能依赖任何一件事。状态码是服务器发回给浏览器的东西,所以你不会在请求中得到这些。

    你没有说你要解决什么问题或者为什么这点很重要。你想解决什么问题?

    不要依赖你无法控制的东西,而是把它变成你可以控制的东西。

    1. 确保您进行了正确的重定向。有redirections for permanent and temporary moves as well as other situation

    2. 如果您不需要实时数据,您可以从日志文件中找出。如果您想了解流量模式,这很方便,但实时性不是很好。

    3. 将其改为内部重定向,而不是外部重定向。您可以通过网络服务器的请求周期对其进行跟踪。

    4. 在外部重定向上设置一个 cookie,然后在下一个请求中查找它。不过,这不会抓住不设置 cookie 的人。

    5. 为重定向添加路径信息,或者按照思南的建议添加查询参数。

    【讨论】:

    • 感谢您的所有建议,但在这种情况下,这些建议都不起作用。重定向都是永久的 301 重定向,由于 SEO 原因,不能是其他任何东西。需要实时数据。内部重定向似乎对目的地没有影响,或者至少对标头没有影响。 cookie 的问题正是您提到的。由于 Google 索引方法,不允许使用参数。
    • 我主要将这些视为内部事物,使用外部世界从未见过的 URL 翻译。
    【解决方案5】:

    受 Brian 的启发,我退后一步,看看究竟是什么导致了我的问题。

    这个问题可能没有答案,但有一个解决方案可以部分解决问题。 通过使用会话 cookie,修改后的内容将仅存在于该特定会话中,因此下次原始内容可以再次访问。 这不会改变在地址栏中重新输入 url 仍然会导致页面使用 cookie 的事实。

    感谢大家的帮助。

    【讨论】:

      【解决方案6】:

      如果请求是重定向,则应该有一个标头指示它是从哪里重定向的。

      【讨论】:

      • 我也是这么想的。但我似乎没有找到解决方法。在这种情况下,HTTP_REFERER 不显示。
      • “应该”是一个强词。 HTTP 规范没有说“应该”。可能有一个标题,但这不是要求,甚至不是建议。
      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 2018-05-16
      • 2022-08-03
      • 2015-04-17
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2015-03-11
      相关资源
      最近更新 更多