Ошибка в порядке выполнения с RewriteRules

По маркетинговым причинам я использую некоторые тщеславные URL для более удобного доступа и для отслеживания некоторых кампаний. К сожалению, я застрял на управляемом выделенном сервере с cPanel, и я предпринял следующие шаги, чтобы написать свои правила:

  • Сначала я добавил xyz.com а также efg.com парковать домены в моей cPanel
  • Тогда я написал все RewriteRuleс, что мне нужно

.htaccess

RewriteCond %{HTTP_HOST} ^xyz\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.xyz\.com$
RewriteRule ^signdirections$ "http\:\/\/xyz\.abc\.com\/en?utm_source=signdirections&utm_medium=advert&utm_campaign=xyz" [R=301,L]


RewriteCond %{HTTP_HOST} ^efg\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.efg\.com$
RewriteRule ^signdirections$ "http\:\/\/efg\.abc\.com\/en?utm_source=signdirections&utm_medium=advert&utm_campaign=efg" [R=301,L]

Теперь проблема в том, что если я попытаюсь получить доступ www.efg.com/signdirectionsЯ буду перенаправлен на www.xyz.com/signredirections версия, а не EFG.

Есть идеи, почему это происходит? Моя интуиция заключается в том, что он обнаруживает одно и то же имя хоста (HTTP_HOST), но я не могу понять, почему.

2 ответа

Решение

Скорее всего, это происходит из-за других ваших правил. Лучше использовать THE_REQUEST переменная, которая не изменяется после применения других правил.

Вы также можете объединить оба ваших правила в одно:

RewriteCond %{HTTP_HOST} ^(?:www\.)?(xyz|efg)\.com$ [NC]
RewriteCond %{THE_REQUEST} /signdirections [NC]
RewriteRule . http://%1.abc.com/en?utm_source=signdirections&utm_medium=advert&utm_campaign=%1 [R=301,L,NE,QSA]
  • Убедитесь, что это ваше первое правило ниже RewriteEngine On линия.
  • Обязательно протестируйте его в новом браузере, чтобы избежать кеша старого браузера.

Я не знаю, может ли это быть ошибкой кеша после плохого теста:
Как долго браузеры кэшируют HTTP 301?

Просто упрощенная версия:

RewriteCond %{HTTP_HOST} ^(?:www\.)?xyz\.com$
RewriteRule ^signdirections$ http://xyz.abc.com/en?utm_source=signdirections&utm_medium=advert&utm_campaign=xyz [R=302,L]

RewriteCond %{HTTP_HOST} ^(?:www\.)?efg\.com$
RewriteRule ^signdirections$ http://efg.abc.com/en?utm_source=signdirections&utm_medium=advert&utm_campaign=efg [R=302,L]

Попробуйте с R=302, и когда все работает, измените на R=301

Другие вопросы по тегам