Назад | Перейти на главную страницу

Почему не работают условия перезаписи Apache?

Я попытался выполнить перенаправление записи в файл .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-путь, но с удаленной строкой запроса.