【问题标题】:Redirect based on Referral only once in htaccess在 htaccess 中仅基于引用重定向一次
【发布时间】:2012-12-06 16:17:21
【问题描述】:

我在 htaccess 中有两个重定向规则: 规则1。 用户来自 domain1.com 到 main-domain.com 重定向到 main-domain.com/dir1/ 规则 2。 对 main-domain.com/dir2/ 的任何请求 --> 重定向到 --> somethingelese.com/something/

单独每个规则都按方面工作。 但主要问题是在根据“domain1.com”的推荐值根据规则 1 从 domain1.com 重定向到 main-domain.com 之后,该推荐值不会被丢弃,并且对于 main-domain.com 的每个下一个请求它仅重定向到 main-domain.com/dir1/ 。 我想要的是根据应该丢弃的推荐只重定向一次之后。并且不应该干扰 main-domain.com 。

代码如下:

Options +FollowSymLinks
RewriteEngine on

RewriteCond %{HTTP_REFERER} ^(.*)domain1\.com [NC]
RewriteRule !dir1 http://main-domain.com/dir1 [R=301,L]

RewriteCond %{REQUEST_URI} ^/dir2/.* [NC]
RewriteRule dir2/(.*) https://somethingelse.com/mfn/$1 [R=301,L]

更多:信息: 我发现的问题是浏览器正在缓存重定向。有什么解决方法吗?

【问题讨论】:

    标签: php .htaccess mod-rewrite


    【解决方案1】:
    Options +FollowSymLinks
    RewriteEngine on
    
    RewriteCond %{HTTP_HOST} !main-domain.com$ [NC]
    RewriteCond %{HTTP_REFERER} ^.*domain1\.com [NC]
    RewriteRule !^dir1 http://main-domain.com/dir1 [R,L]
    
    RewriteCond %{REQUEST_URI} ^/dir2(/.*)? [NC]
    RewriteRule dir2(/(.*))? https://somethingelse.com/mfn$1 [R,L]
    

    MORE:INFO:我发现的问题是浏览器正在缓存重定向。有什么解决方法吗?

    这里的问题可能是状态码 301,这意味着 Moved PermanentlyThis response is cacheable unless indicated otherwise。为避免这种情况,请使用302 Found。有关状态码的更多信息here


    您也可以通过 PHP 来完成(从评论中回答问题):

    if (isset($_SERVER['HTTP_REFERER']) && preg_match('/^.*domain1\.com/', $_SERVER['HTTP_REFERER']) &&
        !preg_match('/main\-domain\.com$/', $_SERVER['HTTP_HOST']) &&
        !preg_match('/^\/dir1/', $_SERVER['REQUEST_URI'])) {
        header('Location: http://main-domain.com/dir1');
        exit(0);
    }
    if (preg_match('/^\/dir2/', $_SERVER['REQUEST_URI'])) {
        header('Location: https://somethingelse.com/mfn' . substr($_SERVER['REQUEST_URI'], 4));
        exit(0);
    }
    

    【讨论】:

    • 对不起,这不起作用。基于引用者的相同重定向!
    • 即使在 R=302 之后仍然存在同样的问题......浏览器正在缓存重定向。我有这方面的工作,否则使用 JS/PHP。?
    • 我在上面测试了 htaccess,对我来说它可以工作。也许您的浏览器已经缓存了先前的重定向(即 301) - 删除缓存并重试,不应缓存 302。我将 R=302 更改为 R,因为 302 是默认值。
    【解决方案2】:

    在重写之前,添加一个 Vary 标头,以便浏览器知道响应可能不一致,而不是缓存它。

    Header set Vary "*"
    

    【讨论】:

    • 好的,我会试试的,它需要 mod_deflate 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多