Я пытался выполнить запись с перенаправлением в файл .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]
, перенаправление больше не выполняется, как если бы условие всегда оценивалось как ложное. Реферер оценивается правильно (я попытался перенаправить на 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? Может ли это зависеть от хостинг-провайдера?
Директивы WordPress находятся внизу файла
.htaccess
, а мои - вверху.
Верно.
RewriteCond % {HTTP_REFERER} domain.tracker.com [NC]
Нет ничего плохого в опубликованной вами директиве RewriteCond
, которая помешала бы этому работать.Условие считается успешным, если заголовок HTTP Referer
содержит строку «domain.tracker.com» (без учета регистра). Все, больше ничего. Имейте в виду, что CondPattern является регулярным выражением, поэтому точки (.
) должны быть экранированы обратной косой чертой, чтобы соответствовать буквальным точкам, в противном случае они соответствуют любому символу (как в вашем примере). Итак, ваша директива потенциально слишком много соответствует, но это не остановит ее работу. например. Он также будет соответствовать 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
. Другими словами, абсолютный URL .
(я подумал, не было ли это просто опечаткой в вашем вопросе, поскольку вы использовали абсолютный URL в связанном вопросе по 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
- это текущий хост (возможно, запрошенный Host ). 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
соответствует строке «article-1» в любом месте запрошенного URL. например. / 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-путь, но с удаленной строкой запроса.