【问题标题】:How to set the referer on a rewrite rule?如何在重写规则上设置引用者?
【发布时间】:2011-03-05 01:08:24
【问题描述】:

我有以下问题:我使用了一个保存引用 URL 的脚本。我希望这个 URL 指向我自己的 URL 之一。因此,假设用户访问页面 http://example.com/page1 我想将该 URL 重写为 http://example.com/page2 并保护该页面上的引荐来源。

我不想使用 PHP 脚本执行此操作,否则每次我想跟踪新的引用者时都必须扩展该脚本。我已经尝试过这些重写规则:

RewriteRule ^page1$ /page2 [R=301,QSA,NC]
RewriteRule ^page1$ /page2 [L,R=301,QSA,NC]

重写有效,但缺少请求参数referer。我是否必须使用除 301 之外的其他状态代码,还是在我的重写中有任何其他错误。甚至可以在重写规则中设置引用者吗?

【问题讨论】:

  • 如果 URL 在重定向后保持不变就好了,但这不是必需的。
  • 我假设你的意思是引用标题?如果是这种情况,我认为你不能,因为 mod_rewrite 会向浏览器发出外部重定向。你得到的referer总是说page1吗?
  • 我确实是指 HTTP_REFERER。我在 URL 中使用 page1 根本没有引荐来源。只有在 URL 中使用 page2 我才能获得正确的引用。

标签: apache .htaccess mod-rewrite http-referer referer


【解决方案1】:

不限于任何类型的重定向,即使是可能覆盖引荐来源网址的重定向,您仍然可以通过显式传递引荐来源网址来保留引荐来源网址,例如到一个新的 http_referer 参数

RewriteRule ^page1$ /page2?http_referer=%{HTTP_REFERER} [NC]

标志说明:

  • [NC] - 不区分大小写的匹配。

【讨论】:

    【解决方案2】:

    使用 R 标志会导致外部重定向。如果您只想要内部重写,请省略 R 标志:

    RewriteRule ^page1$ /page2 [QSA,NC]
    

    【讨论】:

    • 但这不会设置 HTTP_REFERER 还是我错了?我希望 page1 作为 HTTP_REFERER 的值出现在 page2 上。这甚至可以通过重写规则实现吗?
    • @Kau-Boy:内部重写不会改变 HTTP 请求。该请求只是在内部重写为另一个 URI。
    • 所以简而言之,如果没有中间的 PHP 脚本来重定向标头以更改/设置 HTTP_REFERER,这是不可能的?当我必须这样做时,没关系。只是想知道它是否适用于重写规则。 (如果你在你的答案中添加一个“不起作用,我会接受它)。
    • @Kau-Boy:客户端设置该标头字段,而不是服务器。
    • 所以答案是:不可能!感谢您的回答清楚!
    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2013-01-20
    • 2021-09-09
    相关资源
    最近更新 更多