За последние 24 часа нас посетили 18153 программиста и 1590 роботов. Сейчас ищут 1649 программистов ...

Виртуальный субдомены с помощью .htaccess. «Поплыли» относит

Тема в разделе "Регулярные выражения", создана пользователем stran, 2 мар 2013.

  1. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Виртуальный субдомены с помощью .htaccess. «Поплыли» относительные пути к файлам. Как решить проблему?

    Есть домен вида domain.com и есть языковые версии вида ru.domains.com

    С помощью .htaccess написал конструкцию которая бы передавала параметр языка:

    Например запрос: ru.domains.com/index.php?page=1
    Переводится в: domains.com/index.php?page=1&lang=ru

    Проблема состоит в том, что при загрузке страницы
    ru.domains.com/index.php?page=1
    не загружаются стили, картинки и т.д. Все ссылки работают без проблем.

    Попробовал использовать тег base href, но он нестабильно работает с IE.

    Использую «Денвер». Подскажите, как решить задачу? 2 день сижу в интернете. Не могу нащупать что не так ))
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    правила-то будут озвучены?
     
  3. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    В .htaccess следующие правила:

    RewriteCond %{HTTP_HOST} ^([^\.]+)\.domains\.ru$ [NC]
    RewriteCond %{HTTP_HOST} !^www\.domains\.ru$ [NC]
    RewriteRule ^(.*)$ index.php?lang=%1 [L,QSA]

    Параметр передается, текстовый контент грузится, но оформление все слетает.. Помогите найти решение!
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    а оформление динамически генерируется или статика лежит? и как выглядят ссылки на элементы оформления?
     
  5. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    оформление - статика. ссылки на элементы оформления:

    <link rel="stylesheet" href="/pub/css/style.css" media="screen, projection" />

    Ссылки на картинки:
    <a href="" style="background-image:url(/files/8aa7424319b3045d9cd6efc60fc600b3mini.jpg)"></a
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    попробуйте перед своими правилами добавить:
    Код (Text):
    1. RewriteCond %{REQUEST_FILENAME} -f
    2. RewriteRule . - [L]
     
  7. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    Помогло. Огромное спасибо! Я думаю это многим пригодится, т.к. в интернете за 3 дня ничего такого найти не удалось.
    Пожалуйста, напишите еще смысл записи, чтобы я (и думаю многие) поняли механизм действия.

    Я так и знал, что решение должно быть очень простым ))) и в то же время сложным с точки зрения понимания работы с .htaccess.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    когда я начинал работать с реврайтом были доступны только официальные документации, причем тупо растиражированные. примеров было мало, вопросники были еще не популярны. приходилось методом высоконаучного тыка сидеть подбирать правильные правила. поэтому я по сей день стараюсь по возможности помогать другим =)

    приходящий от браузера запрос сначала обрабатывается механизмом алиасов или к нему просто добавляется значение document_root. таким образом Apache образует полную ссылку на запрашиваемый объект для своей файловой системы.
    проверка %{REQUEST_FILENAME} -f тестирует полученный путь к файлу на существование файла на диске. если такой существует то выполняется правило . - с флагом L что по сути означает для любого адреса ни делать ничего и это последнее правило для данного набора.

    пройдемся по вашим правилам:
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.domains\.ru$ [NC]
    RewriteCond %{HTTP_HOST} !^www\.domains\.ru$ [NC]
    RewriteRule ^(.*)$ index.php?lang=%1 [L,QSA]

    в них первой строкой вы тестируете по шаблону домен третьего уровня без учета регистра. кстати, почему шаблон [^\.?]+ - "все кроме точки один и более символов"? покажите мне как будет слово любовь на языке 123@#&*-%. =)
    языковой код может быть только символьным RU/EN и тд или содержать минус "-" при разделении диалекта ru-RU/en-GB/en-US и тд. всё, других символов не будет.
    в данном случае вполне достаточно [a-z]+

    второй строкой вы дополняете к проверке условие "не является доменом WWW" с логикой И

    третьей строкой вы собственно совершаете операцию перезаписи запроса. при этом вы работаете именно со входящим адресом. вам не важно, существует такой файл или нет. под шаблон .* попадает любая последовательность символов, пришедшая от браузера (в данном случае), поэтому будет выполнена переадресация к index.php, которому мы подставим взятый в первой строке "домен" (%1), оригинальную строку GET-запроса (QSA) и это будет последним правилом.

    не совсем ясно зачем вы объявляете именно шаблон. значение-то вы никуда не передаете =) достаточно просто точку оставить как в моем правиле:
    RewriteRule . index.php?lang=%1 [L,QSA]

    Добавлено спустя 1 минуту 49 секунд:
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» относит
    это не htaccess, это mod_rewrite =). да, его можно объявлять на уровне каталога, но я предпочитаю делать так только временно а на рабочих серверах эти правила помещаются в конфигурацию Apache
     
  9. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    Большое спасибо! Еще один вопрос )) Какое правило мне написать, чтобы параметр передавался для всех страниц, не только для index.php? Например, есть страницы что-то вроде www.sub.domains.ru/script.php?id=8&name=ok
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    не понял вопроса. если script.php существует и именно ему нужно параметры передать то добавьте QSA в мое правило. если его не существует то оно будет преобразовано вашим правилом в index.php?lang=%1 и тут же QSA дополнит это строкой &id=8&nade=ok
     
  11. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    script.php существует и именно ему нужно передать параметры. вообще много скриптов существует. то есть задача состоит в том, чтобы всем выполняем скриптам на сайте передавался параметр ?lang=%1
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    переменные окружения тогда используйте. по идее хватит вообще 4 строк:
    Код (Text):
    1. RewriteCond %{HTTP_HOST} ^([^\.]+)\.domains\.ru$ [NC]
    2. RewriteCond %{HTTP_HOST} !^www\.domains\.ru$ [NC]
    3. RewriteCond %{REQUEST_FILENAME} -f
    4. RewriteRule . - [L,QSA,E=DOMAIN_LANG:%1]
     
  13. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    DOMAIN_LANG - переменная окружения? это не совсем то, что нужно. Мне надо реализовать передачу любого произвольного параметра всем скриптам через название домена 3 уровня, допустим: ?param=idparam
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    DOMAIN_LANG переменная окружения, будет видна в любом скрипте. не вижу проблемы передавать этим скриптам любой набора GET-параметров.
     
  15. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    Имеем следующий домен 3 уровня:

    http://param.domains.ru

    сейчас param передается скрипту index.php, если переходим по адресу: http://param.domains.ru
    а если мы перейдем, например, http://param.domains.ru/script.php?id=77,
    то param не передается скрипту script.php.

    Вместо script.php может быть любой другой скрипт (их много).
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    давайте так. вы некорректно описали задачу которая кроется у вас в голове. я понял задачу как необходимость получать из 3rdLD значение переменной lang и она должна быть видима любому скрипту вашего движка.

    config:
    Код (Text):
    1. RewriteEngine On
    2. RewriteCond %{HTTP_HOST} ^([a-z]+)\.domains\.ru [NC]
    3. RewriteCond %{HTTP_HOST} !^www\.domains\.ru [NC]
    4. RewriteCond %{REQUEST_FILENAME} -f
    5. RewriteRule . - [QSA,E=DOMAIN_LANG:%1]
    абсолютно-любой-скрипт.php
    Код (PHP):
    1. <?php
    2. header('Content-Type: text/plain');
    3. $lang = isset( $_SERVER ) && isset( $_SERVER['DOMAIN_LANG'] ) ? trim( $_SERVER['DOMAIN_LANG'] ) : 'ru';
    4. var_dump( $_GET, $lang );
    5. ?>
    http://www.domains.ru/абсолютно-любой-скрипт.php ->
    Код (Text):
    1. array(0) {
    2. }
    3. string(2) "ru"
    en.domains.ru/абсолютно-любой-скрипт.php ->
    Код (Text):
    1. array(0) {
    2. }
    3. string(2) "en"
    http://www.domains.ru/абсолютно-любой-скрипт.php?olo=1 ->
    Код (Text):
    1. array(1) {
    2.   ["olo"]=>
    3.   string(1) "1"
    4. }
    5. string(2) "ru"
    es.domains.ru/абсолютно-любой-скрипт.php?foo=1&bar=2&lang=ru ->
    Код (Text):
    1. array(3) {
    2.   ["foo"]=>
    3.   string(1) "1"
    4.   ["bar"]=>
    5.   string(1) "2"
    6.   ["lang"]=>
    7.   string(2) "ru"
    8. }
    9. string(2) "es"
    работает корректно, следовательно решает задачу в том виде, в котором её понял я.
     
  17. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    Да, Вы правы. Запутал я Вас с этим языком ))
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    вы внимательно прочитали мое предыдущее сообщение? там указаны правила и содержимое тестового скрипта. а еще наглядно показано, как это работает. судя по тому что вы рассказали только что - это и есть ваше решение. интегрируйте его в ваши скрипты и удачи))))
     
  19. stran

    stran Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    10
    Симпатии:
    0
    Re: Виртуальный субдомены с помощью .htaccess. «Поплыли» отн

    XDD Все, наконец, разобрался ))))))