我尝试在 .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
代换不以方案(http
或https
)或斜线(/
)开头,则被视为相对的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-1
URL 路径)。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 路径,但删除了查询字符串。