![]() |
|
![]() ![]() ![]() |
|
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Добрый день!
Подскажите с решением задачи. Есть общий .htaccess на несколько разных сайтов. Нужно сделать 301 редирект для домена domain1.com на домен domain2.com в тех влучаях, когда идет обращение к физически существующим файлам, а во всех остальных случаях выполнить рерайт преобразование и передать управление PHP. Как это можно реализовать? Директиве RewriteCond позволяет указывать уловие физического отсутствия файла/папки: RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d Запрос к хосту domain1.com можно улавливать примерно так: RewriteCond %{HTTP_HOST} ^domain1.com\.$ [NC] Но как все собрать воедино - ума не приложу. |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Мучаю правила со вчерашего дня, пришел к такому виду:
В итоге, во-первых, перекидывает ВСЁ (а не только реально существующие по запросу файлы/папки) на domain2.com, во-вторых, перекидывает по преобразованному урлу (например, с domain1.com/gbdfr на domain2.com/index.php?arg=gbdfr). После изучения всего и всея, понял, почему так происходит. Если файл или папка существует, просто срабатывает первая часть, остальное не удовлетворяет условиям, в итоге переадресовываем - все ок. Если файл или папка не существует, первая часть не срабатывает, НО, срабатывает вторая часть, и при повторном проходе по правилам уже выполнится и первая, т.к. index.php то существует! И как теперь прикажете с этим бороться? ![]() ![]() |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Я тут что подумал. А можно как-то в RewriteCond проверить значение текущего преобразованного адреса? Тогда можно было бы посмотреть, начинается ли он с /index.php и лежит ли в домене domain1.com - если да, то это наш клиент, и подставлять ему переадресацию на domain2.com не нужно. Но так вроде нельзя? Костыль, нонечно, но что делать...
|
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 5 Всего: 386 |
может просто переставить rewritecond с проверкой хоста? К тому же флаг N непонятно накой там стоял
Это сообщение отредактировал(а) ksnk - 18.12.2013, 12:58 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Там не N, а NC - регистронезависимость. Или HTTP_HOST всегда в нижнем будет? Перестановка разве влияет на результат? И не совсем пойму что за влаг C? Из описания следует что он связывает текущее правило со следующим, но разве там не по умолчанию идет AND? Я всегда считал что идут RewriteCond, и если ВСЕХ (с учетом логики по OR) их условия удовлетворяют, то будет выполняться следующий за ними RewriteRule, после чего текущие RewriteCond сбрасывается (не применяется к следующим RewriteRule). Вышеприведенный пример вызывает Internal Server Error, и непонятно почему, в логи ничего не пишется что-то... Если убрать C, то ошибка пропадает, но работает не корректно. Да он корректно работать и не будет при запросах на рерайт, а не реально существующие файлы: - по первому и второму RewriteCond %{REQUEST_FILENAME} пролетаем с RewriteRule ^(.*)$ http://domain2\.com/$1 - пока все ок; - выполняется RewriteRule ^(.*)/$ /index.php?arg=$1 [L]; строка была изменена, так что повторная итерация - первый RewriteCond %{REQUEST_FILENAME} срабатывает (т.к. /index.php есть), и создается внешнее перенаправление.... Или я что не так понял? ![]() ![]() Добавлено через 10 минут и 11 секунд Вру, пакет из Денвера почему-то не знает флаг С. Сейчас проведу эксперимент на хосте, но не думаю что будет позитивный, корректный результат. Это сообщение отредактировал(а) maxipub - 18.12.2013, 13:23 |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
||||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 5 Всего: 386 |
Да, с флагами фигня'c.
Я что-то подумал, что флаги однобуквенные. N - это "давай по новой", а С - nocase... В общем, извиняюсь. А с NC будет работать? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Работает, но не корректно - так же, как описано выше. Вообще, насколько я догоняю, там последовательность не принципиальна, т.к. набор условий или выполняется, или не выполняется. ![]() х3 что и делать, тут одна мысля пришла на ум, извращение, но сейчас проверю один вариант, отпишусь.... ![]() |
|||
|
||||
maxipub |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Капец, ничего не вышло с той затеи. Вон тут написано про переменные окружения, имеем код:
Т.е. по логике вещей, если файл или директория не существуют, модрерайт переписывает адрес на существующий /index.php, и устанавливает нашу переменную окружения NORED=1, чтобы при повторной итерации правило RewriteCond %{ENV:NORED} !^1$ предотвратило внешнее перенаправление, но... На практике ничего не работает. ![]() ![]() ![]() ![]()
Но на второй итерации он этого не видет:
Да и я просто подставлял %{ENV:NORED} в RewriteRule, эффекта нет. Такие дела. ![]() ![]() ![]() ![]() |
||||||
|
|||||||
maxipub |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Да, ребята, давно такой жести не было.
![]() ![]() ![]()
что:
Делают вид что никакой переменной нет. ![]() Такие вот пироги... ![]() ![]() ![]() ![]() ![]() Добавлено через 5 минут и 57 секунд Было приятно поговорить вслух. ![]() Это сообщение отредактировал(а) maxipub - 19.12.2013, 13:53 |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Администрирование Web серверов и Web служб | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |