Перенаправление одной страницы с другого домена на основной домен вызывает слишком много перенаправлений

#php #apache #.htaccess #mod-rewrite #redirect

#php #apache #.htaccess #мод-перезапись #перенаправление

Вопрос:

Мне нужно перенаправить только мою /login страницу в другом домене на мой основной домен.

Однако то, что у меня сейчас есть, вызывает слишком много перенаправлений.

Чего мне не хватает?

.htaccess:

 RewriteCond %{HTTP_HOST} ^domain.com$
RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^otherdomain.com$ [NC]
# RewriteRule ^login https://www.domain.com/login [R=301,L]  GIVES TOO MANY REDIRECTS
RewriteRule ^(.*)$ http://www.otherdomain.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^domain.com$
RewriteCond %{HTTPS} !=on
RewriteRule ^/? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(. )$ index.php?url=$1 [L,QSA]
  

Комментарии:

1. /login/ Это каталог?

2. @anubhava Нет, нет каталога.

3. Раскомментируйте /login правило, а затем откройте Firebug и посетите http://otherdomain.com/login страницу, чтобы увидеть, сколько перенаправлений происходит

4. @anubhava Около 21 перенаправления, прежде чем Firefox отключит бесконечный цикл.

5. Хорошо, но что это за перенаправления? Они перенаправляют на http://otherdomain.com/login и http://domain.com/login туда и обратно?

Ответ №1:

хорошо, попробуйте это .htaccess:

 RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www.)?otherdomain.com$ [NC]
RewriteRule ^login https://www.domain.com/login [R=301,L,NC]

RewriteCond %{HTTP_HOST} ^otherdomain.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{HTTP_HOST} ^domain.com$ [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(. )$ index.php?url=$1 [L,QSA]
  

И обязательно протестируйте в новом браузере, чтобы избежать кэширования браузера 301.

Комментарии:

1. Теперь каждая страница перенаправляется на domain.com . Необходимо перенаправить только /login .

2. Почти! На otherdomain.com пока нет www исправления.

Ответ №2:

Я вижу две проблемы.

A.

Ваше перенаправление https не проверяет, используете ли вы уже https. Поэтому после перенаправления на https://www.domain.com/login ваше https правило срабатывает.

Обычно вы бы изменили свое первое правило, добавив это условие (первая строка вверху):

 RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^domain.com$
RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L]
  

Но мне кажется, вы можете вообще удалить это правило, поскольку вы уже используете https с этим правилом:

 RewriteCond %{HTTP_HOST} ^domain.com$
RewriteCond %{HTTPS} !=on
RewriteRule ^/? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
  

Попробуйте это: раскомментируйте правило входа и прокомментируйте первое правило https.

B. Вторая проблема заключается в том, что otherdomain.com перенаправляет на себя:

 RewriteCond %{HTTP_HOST} ^otherdomain.com$ [NC]
# RewriteRule ^login https://www.domain.com/login [R=301,L]  GIVES TOO MANY REDIRECTS
RewriteRule ^(.*)$ http://www.otherdomain.com/$1 [R=301,L]
  

Одно условие применяется только к одному правилу. Прямо сейчас это приводит к перенаправлению файлов на otherdomain на самих себя.

На данный момент вам нужно закомментировать эту строку:

 RewriteRule ^(.*)$ http://www.otherdomain.com/$1 [R=301,L]
  

Комментарии:

1. Все еще получается слишком много перенаправлений. Я попробовал оба ваших решения. Продолжает перенаправлять на otherdomain.com/login

2. Добавлена часть B к ответу. 🙂

3. При применении части B он просто остается включенным otherdomain.com/login