Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с .htaccess 
:(
    Опции темы
maxipub
Дата 17.12.2013, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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]

Но как все собрать воедино - ума не приложу.
PM MAIL   Вверх
maxipub
Дата 18.12.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Мучаю правила со вчерашего дня, пришел к такому виду:

Код

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{HTTP_HOST} ^domain1\.com$ [NC]
RewriteRule ^(.*)$ http://domain2\.com/$1 [R=301,L]

#... дальше идут нужные по сайту преобразования
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /index.php?arg=$1 [L]


В итоге, во-первых, перекидывает ВСЁ (а не только реально существующие по запросу файлы/папки) на domain2.com, во-вторых, перекидывает по преобразованному урлу (например, с domain1.com/gbdfr на domain2.com/index.php?arg=gbdfr). После изучения всего и всея, понял, почему так происходит.

Если файл или папка существует, просто срабатывает первая часть, остальное не удовлетворяет условиям, в итоге переадресовываем - все ок.

Если файл или папка не существует, первая часть не срабатывает, НО, срабатывает вторая часть, и при повторном проходе по правилам уже выполнится и первая, т.к. index.php то существует!

И как теперь прикажете с этим бороться? smile  smile 
PM MAIL   Вверх
maxipub
Дата 18.12.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Я тут что подумал. А можно как-то в RewriteCond проверить значение текущего преобразованного адреса? Тогда можно было бы посмотреть, начинается ли он с /index.php и лежит ли в домене domain1.com - если да, то это наш клиент, и подставлять ему переадресацию на domain2.com не нужно. Но так вроде нельзя? Костыль, нонечно, но что делать...
PM MAIL   Вверх
ksnk
Дата 18.12.2013, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 5
Всего: 386



может просто переставить rewritecond с проверкой хоста? К тому же флаг N непонятно накой там стоял
Код

RewriteCond %{HTTP_HOST} ^domain1\.com$ [C]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ http://domain2\.com/$1 [R=301,L]

#... дальше идут нужные по сайту преобразования
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /index.php?arg=$1 [L]


Это сообщение отредактировал(а) ksnk - 18.12.2013, 12:58


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 18.12.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(ksnk @  18.12.2013,  12:58 Найти цитируемый пост)
К тому же флаг N непонятно накой там стоял

Там не N, а NC - регистронезависимость. Или HTTP_HOST всегда в нижнем будет?

Цитата(ksnk @  18.12.2013,  12:58 Найти цитируемый пост)
может просто переставить rewritecond с проверкой хоста?

Перестановка разве влияет на результат? И не совсем пойму что за влаг 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 есть), и создается внешнее перенаправление....

Или я что не так понял? smile  smile

Добавлено через 10 минут и 11 секунд
Цитата(maxipub @  18.12.2013,  13:19 Найти цитируемый пост)
Вышеприведенный пример вызывает Internal Server Error

Вру, пакет из Денвера почему-то не знает флаг С. Сейчас проведу эксперимент на хосте, но не думаю что будет позитивный, корректный результат.

Это сообщение отредактировал(а) maxipub - 18.12.2013, 13:23
PM MAIL   Вверх
maxipub
Дата 18.12.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(maxipub @  18.12.2013,  13:19 Найти цитируемый пост)
проведу эксперимент

[alert] /.htaccess: RewriteCond: unknown flag 'C' smile  smile  smile  smile 
PM MAIL   Вверх
ksnk
Дата 18.12.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 5
Всего: 386



Да, с флагами фигня'c.
Я что-то подумал, что флаги однобуквенные. N - это "давай по новой", а С - nocase... В общем, извиняюсь.
А с NC будет работать?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 18.12.2013, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(ksnk @  18.12.2013,  15:11 Найти цитируемый пост)
А с NC будет работать? 

Работает, но не корректно - так же, как описано выше. Вообще, насколько я догоняю, там последовательность не принципиальна, т.к. набор условий или выполняется, или не выполняется. smile

х3 что и делать, тут одна мысля пришла на ум, извращение, но сейчас проверю один вариант, отпишусь.... smile 
PM MAIL   Вверх
maxipub
Дата 19.12.2013, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Капец, ничего не вышло с той затеи. Вон тут написано про переменные окружения, имеем код:

Код

RewriteCond %{ENV:NORED} !^1$
RewriteCond %{HTTP_HOST} ^domain1\.com$ [C]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ http://domain2\.com/$1 [R=301,L]

#... дальше идут нужные по сайту преобразования
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /index.php?arg=$1 [L,E=NORED:1]


Т.е. по логике вещей, если файл или директория не существуют, модрерайт переписывает адрес на существующий /index.php, и устанавливает нашу переменную окружения NORED=1, чтобы при повторной итерации правило RewriteCond %{ENV:NORED} !^1$ предотвратило внешнее перенаправление, но... На практике ничего не работает. smile  smile  smile  smile Такое впечателние, что переменная просто не устанавливается по невыясненным причинам, хоть идем в логи:

Код
(5) setting env variable 'HTM' to '1'


Но на второй итерации он этого не видет:

Код
RewriteCond: input='' pattern='!^1$' => matched


Да и я просто подставлял %{ENV:NORED} в RewriteRule, эффекта нет.

Такие дела.  smile  smile  smile  smile 
PM MAIL   Вверх
maxipub
Дата 19.12.2013, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Да, ребята, давно такой жести не было. smile Я уже дошел до чтения архивов западных форумов, где в одной ветке за 2004-й год парни пришли к выводу что это баг Апача / модрерайта smile В общем, я так и не понял, почему надо так делать, и даже толком не помню как я к этому пришел, но обращаться к переменной надо по имени %{ENV:REDIRECT_NORED} - тогда она работает. Кстати, еще одной интересной особенностью своих "переменных окружения" в модрерайте является невозможность их подставки в RewriteRule smile например, что:

Код
RewriteRule ^(.*)/$ /%{ENV:NORED}.php


что:

Код
RewriteRule ^(.*)/$ /%{ENV:REDIRECT_NORED}.php


Делают вид что никакой переменной нет. smile 

Такие вот пироги... smile  smile  smile  smile  smile

Добавлено через 5 минут и 57 секунд
Было приятно поговорить вслух. smile ksnk, спасибо за участие в теме!

Это сообщение отредактировал(а) maxipub - 19.12.2013, 13:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование Web серверов и Web служб | Следующая тема »


 




[ Время генерации скрипта: 0.1251 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.