Я попытался выполнить перенаправление записи в файл .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=val, который является правильным реферером).
Единственная другая инструкция по перезаписи, которая у меня есть в файле .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
files, это означает, что он рассматривается относительно каталога файловой системы, который содержит .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
соответствует строке «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-путь, но с удаленной строкой запроса.