在htaccess中仅基于推荐重定向一次

时间:2012-12-06 16:17:22

标签: php .htaccess mod-rewrite

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

单独使用每个规则按预期工作。 但主要问题是根据规则1从domain1.com重定向到main-domain.com基于“domain1.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]

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

2 个答案:

答案 0 :(得分:0)

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]

  

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

此处的问题可能是状态代码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);
}

答案 1 :(得分:0)

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

Header set Vary "*"