Почему не работают условия перезаписи 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= 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
задан 20 September 2018 в 00:23
1 ответ

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

1
ответ дан 3 December 2019 в 23:12

Теги

Похожие вопросы