| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Администрирование Web серверов и Web служб > Помогите с .htaccess |
| Автор: maxipub 17.12.2013, 13:55 |
| Добрый день! Подскажите с решением задачи. Есть общий .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 18.12.2013, 10:51 | ||
Мучаю правила со вчерашего дня, пришел к такому виду:
В итоге, во-первых, перекидывает ВСЁ (а не только реально существующие по запросу файлы/папки) на domain2.com, во-вторых, перекидывает по преобразованному урлу (например, с domain1.com/gbdfr на domain2.com/index.php?arg=gbdfr). После изучения всего и всея, понял, почему так происходит. Если файл или папка существует, просто срабатывает первая часть, остальное не удовлетворяет условиям, в итоге переадресовываем - все ок. Если файл или папка не существует, первая часть не срабатывает, НО, срабатывает вторая часть, и при повторном проходе по правилам уже выполнится и первая, т.к. index.php то существует! И как теперь прикажете с этим бороться? |
| Автор: maxipub 18.12.2013, 11:38 |
| Я тут что подумал. А можно как-то в RewriteCond проверить значение текущего преобразованного адреса? Тогда можно было бы посмотреть, начинается ли он с /index.php и лежит ли в домене domain1.com - если да, то это наш клиент, и подставлять ему переадресацию на domain2.com не нужно. Но так вроде нельзя? Костыль, нонечно, но что делать... |
| Автор: ksnk 18.12.2013, 12:58 | ||
может просто переставить rewritecond с проверкой хоста? К тому же флаг N непонятно накой там стоял
|
| Автор: maxipub 18.12.2013, 13:19 |
Там не 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:37 |
[alert] /.htaccess: RewriteCond: unknown flag 'C' |
| Автор: ksnk 18.12.2013, 15:11 |
| Да, с флагами фигня'c. Я что-то подумал, что флаги однобуквенные. N - это "давай по новой", а С - nocase... В общем, извиняюсь. А с NC будет работать? |
| Автор: maxipub 18.12.2013, 15:17 |
Работает, но не корректно - так же, как описано выше. Вообще, насколько я догоняю, там последовательность не принципиальна, т.к. набор условий или выполняется, или не выполняется. х3 что и делать, тут одна мысля пришла на ум, извращение, но сейчас проверю один вариант, отпишусь.... |
| Автор: maxipub 19.12.2013, 11:56 | ||||||
Капец, ничего не вышло с той затеи. Вон http://www.opennet.ru/base/dev/redirect_url.txt.html написано про переменные окружения, имеем код:
Т.е. по логике вещей, если файл или директория не существуют, модрерайт переписывает адрес на существующий /index.php, и устанавливает нашу переменную окружения NORED=1, чтобы при повторной итерации правило RewriteCond %{ENV:NORED} !^1$ предотвратило внешнее перенаправление, но... На практике ничего не работает.
Но на второй итерации он этого не видет:
Да и я просто подставлял %{ENV:NORED} в RewriteRule, эффекта нет. Такие дела. |
| Автор: maxipub 19.12.2013, 13:48 | ||||
Да, ребята, давно такой жести не было.
что:
Делают вид что никакой переменной нет. Такие вот пироги... Добавлено через 5 минут и 57 секунд Было приятно поговорить вслух. |