为什么 Apache Rewrite Conditions 不起作用?

为什么 Apache Rewrite Conditions 不起作用?

我尝试在 .htaccess 文件中执行重定向写入:

RewriteEngine on
RewriteRule article-1 www.another-site.com/article-1 [R=301,L,NC]

并且它正常工作。无论如何,当我添加重写条件时,例如:

RewriteEngine on
RewriteCond %{HTTP_REFERER} domain.tracker.com [NC]
RewriteRule article-1 www.another-site.com/article-1 [R=301,L,NC]

重定向不再执行,就好像条件始终被评估为 false 一样。引用者被正确评估(我尝试重定向到 www.site.com?ref=%{HTTP_REFERER},结果得到了 www.site.com?ref=https://domain.tracker.com/?queries=vals,这是正确的引荐来源)。

我在 .htaccess 文件中唯一的其他重写指令是

#BEGIN WORDPRESS    
<IfModule mod_rewrite.c>
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
#END WORDPRESS

为什么条件不起作用? 这可能是与 WordPress 指令冲突吗? 这可能取决于托管服务提供商吗?

答案1

WordPress 指令位于文件的底部.htaccess,而我把我的指令放在了顶部。

那是对的。

RewriteCond %{HTTP_REFERER} domain.tracker.com [NC]

您发布的指令实际上没有任何错误RewriteCond,不会阻止其正常工作。状况如果 HTTPReferer标头包含字符串“domain.tracker.com”(不区分大小写)。就是这样,没有其他内容。请记住条件模式是一个正则表达式,因此点 ( .) 需要使用反斜杠转义才能匹配文字点,否则它们会匹配任意字符(您的示例中就是这种情况)。因此,您的指令可能匹配过多,但这不会阻止它工作。例如,它还会匹配以下形式的 HTTP Referer http://example.com/domain-tracker-com/foo:。

最常见的原因是状况不起作用是指HTTP_REFERER不包含您期望的内容。您肯定知道,标Referer头非常不可靠:它可能被客户端和/或网站阻止,并且很容易伪造的.虽然你的测试出现以表明其Referer已按预期通过,所以这是一个谜。

RewriteRule article-1 www.another-site.com/article-1 [R=301,L,NC]

但是,那RewriteRule 代换(即www.another-site.com/article-1)在此上下文中无效,不会导致所述的重定向,即到外部主机www.another-site.com。您缺少必需的方案(例如http)并且应采用以下形式:http://www.another-site.com/article-1。换句话说,绝对网址

(我想知道这是否只是你问题中的一个拼写错误,因为你在SO上的相关问题,但您似乎已在评论中确认了它是正确的。)

当。。。的时候RewriteRule 代换不以方案(httphttps)或斜线(/)开头,则被视为相对的URL 路径。在每个目录.htaccess文件中,这意味着它被视为相对于包含该.htaccess文件的文件系统目录,这被称为“目录前缀”(除非RewriteBase指令另有说明或指令被“继承”)。这目录前缀被添加回代换在重写过程结束时。在上述情况下,RewriteRule这很可能会导致完全无效的重定向,形式如下:

http://example.com/home/user/public_html/www.another-site.com/article-1

其中/home/user/public_html/是目录前缀,即.htaccess文件所在位置的绝对文件系统路径。example.com是当前主机(可能是主持人已请求的www.another-site.com/article-1URL 路径)。RewriteRule 代换

如上所述,您需要包含方案/协议来形成绝对 URL:

RewriteCond %{HTTP_REFERER} domain\.tracker\.com [NC]
RewriteRule article-1 http://www.another-site.com/article-1 [R=301,L,NC]

还要注意,正则表达式article-1匹配请求 URL 内任意位置的字符串“article-1”。例如/foo-article-1-bar/也会匹配。如果您匹配的是特定 URL,则应该匹配该特定 URL,例如 。如果^article-1$目标网站上的 URL 路径相同,则可以通过捕获 URL 路径并在 中使用反向引用来避免重复RewriteRule 代换。 例如:

RewriteRule ^(article-1)$ http://www.another-site.com/$1 [R=301,L,NC]

为什么状况不工作?

从给出的信息来看,没有合理的解释。

会不会和 WordPress 指令冲突?

通过放置这些指令WordPress 前端控制器几乎消除了这种可能性。

这取决于托管服务提供商吗?

这是不太可能的。


尝试用一个简单的查询字符串来代替:

RewriteCond %{QUERY_STRING} ^bar=1$
RewriteRule ^(foo)$ http://example.com/$1 [R,QSD,L]

要求:

/foo?bar=1

您将被临时(302)重定向至:

http://example.com/foo

即相同的 URL 路径,但删除了查询字符串。

相关内容