2012-02-12 2 views
2

Я, кажется, нарисовал себя в угол с моими планами на ряд поддоменов веб-сайта. Интересно, могут ли мои планы спастись или я действительно выстрелил себе в ногу и должен был бы полностью переписать массу вещей? Вот проблема:Субарендация субдоменов

Я планировал серию сайтов поддоменов, имеющих дело с вариациями на тему. Для иллюстративных целей давайте притворимся, что у меня есть сайт www.colour.com (это «хаб», файлы которого находятся в public_html), а затем я добавляю субдомены red.colour.com (в public_html/red), green.colour.com (в public_html/green) и blue.colour.com (в public_html/blue). Хорошо, все хорошо до этого момента.

Дело в том, что все эти сайты имеют много ресурсов в общих таблицах стилей, Javascripts, изображениях и т. Д. Это ресурсы, которые я не хочу реплицировать, потому что это пустая трата пространства, но что более важно, я хочу рисковать разработкой разных версий файлов, и они не все поддерживают друг друга. Поэтому я сделал то, что, как я думал, был здравомыслящим, и я храню все это в «хабе» (в public_html/css, public_html/js и т. Д.).

То, что я обнаружил, когда мой сайт шел почти вживую, состоял в том, что, как только я определил, например, public_html/red как red.colour.com, он больше не мог «видеть» любые поддерживающие файлы, которые были расположены на одном уровне выше (в ../), и поэтому появление и функциональность сломались в полный экран.

Нельзя переписывать майор, есть ли выход из этой неразберихи, о которой каждый может думать?

Заранее благодарен!

Frank.

+0

Фрэнк, нам нужно больше информации. Как вы реализуете свои поддомены: с отдельными vhosts или с помощью '% {HTTP_HOST}' декодирования? То, что вы просите, легко выполнимо, но зависит от этого. Также, если вы используете общий хостинг, сделайте 'phpinfo()' и сообщите нам, установил ли ваш провайдер какие-либо переменные среды или сервера с тем же значением, что и ваш ** DOCUMENT_ROOT **. И затем я могу опубликовать решение. Спасибо – TerryE

+0

Привет Терри. Так жаль, что я только что видел ваши комментарии здесь. Вы, возможно, спасли мне часы тяжелой работы и стресса! Я действительно решил проблему и просто разместил свой собственный ответ здесь. Это кажется достаточно кратким, но если вы видите слабость в нем и имеете лучшее решение, я бы хотел услышать об этом! Попытка ответить на ваши вопросы жестко. Я установил поддомены через cpanel.Как это реализовано, я не знаю. Я вышел из своей глубины. Второй вопрос, который вы задали: PHPRC, _SERVER ["DOCUMENT_ROOT"], _SERVER ["PHPRC"], _ENV ["DOCUMENT_ROOT"] имеют то же значение, что и DOCUMENT_ROOT. Надеюсь, это поможет! Фрэнк. – Frankie

+0

Фрэнк, я заметил, что вы используете общий сервис, поэтому я добавил тэг htaccess. Также проверьте свой почтовый ящик. Когда некоторые сообщения комментируют вам, они связаны там :) – TerryE

ответ

1

Я взломал его! Он требовал 1 пинту крови, 2 галлонов пота и 3 магнума слез, но я, наконец, взломал его. Секрет заключается в использовании mod.rewrite, поскольку я начал подозревать. Вы можете действительно не касаетесь областей над корнем, но есть и другие способы ссылаются в такие места, в частности, вы можете обратиться к файлам или каталогам, которые «не существуют», используя условия перепишут здесь:

RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

Так например, если вы хотите обратиться к каталогу таблицы стилей, который был на более высоком уровне, чем конкретный контекст, вы должны ссылаться на ../css, но после того, как вы внесли текущий контекст в свой собственный поддомен. ./css больше не существует. Это означает, что вы можете сделать совпадение с одним или обоими вышеупомянутыми условиями перезаписи. Теперь это всего лишь случай указания клиенту (например,) каталога css через исходный домен www.colour.com/css в моем примере. Здесь, для полноты и помощи любой другой бедной душе от убийства себя над этим (мне пришлось изучать регулярные выражения, mod.rewrite, и Господь знает, что еще через 6 часов, чтобы решить эту проблему, так что я надеюсь, что кто-то еще выиграет, а также я!)

DirectoryIndex index.php 
Options +FollowSymLinks 
RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ http://www.colours.com/$1 [R=301,L] 

Там могут быть некоторые другие директивы, стоит добавить, например, чтобы сделать его не переписать скрытые файлы, чтобы предотвратить его перекручивание т.д., но я не узнать достаточно о mod.rewrite еще, чтобы сделать это squeeky чистый , Однако он работает так, как есть, и это 99.99999% моей основной цели.

Редактировать неделю.

Живя с этим решением, я должен признать, что за это немного магии стоит заплатить. Я не эксперт, как вы бы почерпнули, но мне кажется, что это решение заставляет браузер запрашивать каждый из задействованных ресурсов дважды.Это может быть не проблема, если ваш сайт мал, а эффективность удалена незаметно, но если вы хотите быть ориентиром для оптимального времени загрузки, вам, возможно, придется взвесить pro и con от использования этого решения по сравнению с перекодировкой ваших ссылок в что-то более прямое. Просто так вы знаете!

+0

Я впечатлен тем, что это работает. Действительно странно, что он переводит запрос на http: //foo.com /../ css/'на' http: // bar.com/css/'. Обратите внимание, что '../' был опущен неявно. Вы знаете, зарегистрирована ли эта функция? –

+0

@ охлаждение, нет. Это ** общая ** услуга, поэтому ** www ** отображает ** DOCROOT **, ** красный ** на ** DOCROOT/красный ** и т. Д., Поэтому перенаправление 'http://red.colours.com/css/style.css' на 'http: // www.colours.com/css/style.css' просто удаляет' red/'в ** REQUEST_FILENAME **. – TerryE

+0

@TerryE См. Первый комментарий к первому комментарию OP * (я не удалял его, чтобы вы могли его прочитать). * У него есть файл в 'red.colour.com /' со ссылкой на таблицу стилей. ./CSS/foo.css'. Его решение волшебным образом изменяет запрос на этот файл на перенаправление на 'www.colour.com/css/foo.css', отбрасывая' ../'. Я тестировал это в telnet, и он делает именно это. Не стесняйтесь протестировать его самостоятельно и опубликовать свои результаты. –

-2

Фрэнк, один легкий дразнить: дайте нам XYZ «тогда я могу опубликовать решение» не совсем согласуется с «каждым источником, включая мою веб-хостинговую компанию, сказал, что это невозможно сделать».

Ваш подход только сортирует то, что вы хотите, потому что перенаправление 301, как это, просто возвращает проблему обратно в браузер клиента, сообщая ему, чтобы восстановить ресурс из вашего другого субдомена, чтобы он выполнял два запроса для каждого ресурса, что замедляет вниз время загрузки на клиенте.

Ваше первое решение является то, что вы могли бы сделать, только непосредственно кодирование http://common.colour.com/... в вашем ЦСИ и HREF атрибутов в вашем HTML. Но это имеет недостаток, что вам нужно изменить свои сценарии. Этот подход на самом деле довольно распространен, так как многие сайты с большими объемами используют отдельный домен для такого статического ресурса, и теперь для этого часто используется CDN. Он также может иметь преимущества производительности, поскольку браузеры обычно открывают два потока для каждого домена для загрузки контента, но параллельные запросы для разделения потоков.

Ваше второе решение - сделать это в файловой системе вашего сервера. Что вам нужно сделать, так это создать символические ссылки для DOCROOT/red/css для DOCROOT/css и т. Д. Если вы создаете скрипты на PHP, вы можете сделать это, создав и выполнив временный скрипт конфигурации в своем DOCROOT и вызовите его, чтобы добавить эти ссылки (которые появляются в вашем FTP-браузере в виде отдельных экземпляров каталога, но на самом деле все это указывает на общие ресурсы Основная функция, что вам нужно использовать это symlink() как это:.

<?php 
$root=dirname(__FILE__); 
foreach(array('red', 'green', 'blue') as $c){ 
    foreach(array('css', 'js') as $d) { 
    symlink("$root/$c", "$root/$d/$c); 
    } 
} 

вы должны были бы настроить цвета и каталоги ресурсов Обратите внимание, что я только что напечатал это и не отладил его - стоит дополнительно ;-)

Третьим решением является использование файла .htaccess, но для внутренних переадресаций а не внешние. Здесь модуль перезаписи Apache отображает запрос непосредственно на другой путь/имя файла. Я предполагаю, что ваш Cpanel позволяет отображать XXX.colour.com к DOCROOT/ххх и т.д., так что «GET /css/sheet.css» к HTTP_HOSTred.colour.com получает обрабатываются как DOCROOT/red/css/sheet.css. Как вы приближаетесь это зависит от того, используете ли вы один .htaccess в DOCROOT или отдельной red/.htaccess и т.д. Если первое можно использовать правило, как:

RewriteEngine On 
RewriteBase /

RewriteRule (red|green|blue)/(css|js|images)/(.*) /$2/$3 [L] 

Вы хотите водительство/на целевой строке правила здесь.

Попробуйте это, и надеемся, что это поможет :-)

+0

@couling: о чем вы болтаете? (a) Единственным человеком, который обсуждал или подразумевал «не перекодирование», является _you_. (б) Моим вторым вариантом является добавление символических ссылок; показывая, как это сделать с одноразовым сценарием конфигурации ***, а не *** перекодирование приложения. (c) Моим третьим вариантом является добавление некоторых строк в файл .htaccess, а не файл 'vconf', как в вашем случае. Опять *** не *** перекодировка. По крайней мере, OP может это сделать. Если вы собираетесь подавать ответ, делайте это по разумным причинам. – TerryE

+0

Извините, этот ответ был слишком сильным. OP ничего не упоминает о перекодировке, но я согласен с тем, что это произошло в вашем ответе на ответ. Однако, когда 2 из 3 вариантов не требуют перекодировки приложения, я все еще понимаю обоснование ваших замечаний. Это должно быть средством, помогающим плакатам, а не конкуренцией между респондентами :-) – TerryE

+0

Re 400 статус на запрос вложения '/../' - да, но так как я не предлагаю использовать '/ ../'почему это вообще имеет отношение к моим параметрам? Я фактически избегал этой ловушки. Я не изменяю ваш предлагаемый подход, просто предлагаю 3 альтернативы. – TerryE

Смежные вопросы