htaccess Redirect 301 соединяется - PullRequest
       20

htaccess Redirect 301 соединяется

1 голос
/ 27 января 2020

У меня около 100 + - перенаправления в файле .htaccess, и некоторые URL-адреса связаны друг с другом.

Например:

Redirect 301 /air-india-trial/air-india-promo-conditions/ /features/

Переход к

/trial/air-india-promo-conditions/  

Из-за

Redirect 301 /air-india-trial/ /trial/

Таким образом, URL заменяет '/ air-india-trial /' на '/ trial /' из-за вызова второго перенаправления. Я уже пытался поместить https://example.com/ перед вторым URL в Redirect 301, но это не работает. Не уверен, что это важно, но URL /air-india-trial/ не существует на новом сайте. Домен такой же, как старый сайт, хотя. У кого-нибудь есть идея исправить эти цепочки перенаправления?

1 Ответ

0 голосов
/ 27 января 2020
Redirect 301 /air-india-trial/air-india-promo-conditions/ /features/

Идет к

/trial/air-india-promo-conditions/

Предположительно, вы имеете в виду запрос для /air-india-trial/air-india-promo-conditions/, который перенаправляется на /trial/air-india-promo-conditions/ (то есть директива не "go to" что-либо).

... из-за вызова второго перенаправления. Я уже пытался поместить https://example.com/ перед вторым URL в Redirect 301, но это не работает.

Вы не можете поместить https://example.com/ как часть URL в первом аргументе - если это то, что вы имеете в виду? Это просто не будет соответствовать. Он сопоставляется только с URL-путем.

Поскольку директива Redirect имеет соответствие префикса (и все, что после совпадения копируется в конец целевого URL), вам необходимо заказать ваши Redirect директивы в порядке специфичности. Наиболее конкретное перенаправление c (ie. Longest path) должно быть до того, как перенаправления менее специфицированные c. Директивы

mod_alias Redirect не объединяются, как вы, вероятно, подразумеваете.

Итак, в вашем примере следующее должно работать для перенаправления /air-india-trial/air-india-promo-conditions/ на /features/:

Redirect 301 /air-india-trial/air-india-promo-conditions/ /features/
Redirect 301 /air-india-trial/ /trial/

(Хотя вы, возможно, и предполагаете, что директивы уже в порядке (или Вы просто ссылаетесь на порядок в своем вопросе?) В этом случае все еще существует конфликт с другой директивой или вы видите кешированный ответ.)

После внесения этого изменения вам потребуется очистить кеш браузера. так как 301 (постоянное) перенаправление будет кэшироваться браузером.

Если вы специально хотите перенаправить только /air-india-trial/, а не /air-india-trial/<something>, тогда вам нужно использовать директиву RedirectMatch, которая соответствует регулярное выражение и не соответствует префиксу. Например:

RedirectMatch 301 ^/air-india-trial/$ /trial/

Кроме того, если у вас есть какие-либо перенаправления mod_rewrite (RewriteRule), то они могут конфликтовать. Поскольку разные модули Apache работают независимо и в разное время на протяжении запроса, следует избегать смешивания перенаправлений из обоих модулей из-за потенциальных конфликтов. (mod_rewrite всегда запускается первым на Apache 2.4, несмотря на очевидный порядок этих директив в .htaccess.)

...