#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