Нестандартная ситуация с перенаправлением поддоменов и доменов в PHP - PullRequest
1 голос
/ 29 марта 2012

Ребята!

Я объясню, что я хочу сделать.Если кто-то может помочь с этим, пожалуйста, дайте несколько советов.

У меня есть веб-сайт, назовем его http://mysite.com. И субдомен, скажем, http://myname.mysite.com.

Есть одинКонфигурационный файл inc.php с некоторыми персональными данными для mysite.com и myname.mysite.com, например, номер ICQ.Все общие файлы веб-сайта, расположенные в каталоге mysite.com.

Я хочу иметь возможность использовать все общие файлы mysite.com на поддомене myname.mysite.com, чтобы не создавать полностью похожие файлы на поддомене.Но с включением отдельного файла конфигурации, расположенного на myname.mysite.com, содержащего индивидуальный номер ICQ.

Вот пример того, как я хочу, чтобы это работало:

  1. Основной домен «mysite.com» имеет корневую папку «public_html» со ​​страницами: index.php, about.php, article.php и файл конфигурации inc.php с номером icq «111-111».Таким образом, при серфинге на сайте «mysite.com» вы видите там номер ICQ от inc.php.

  2. Субдомен «myname.mysite.com» имеет папку «public_html / subdomain / myname» столько файл конфигурации inc.php с номером ICQ "222-222".Таким образом, при переходе на myname.mysite.com вы увидите веб-страницы с сайта «mysite.com», но отсюда появится номер ICQ «public_html / subdomain / myname / inc.php».И в адресной строке вы увидите веб-страницы как: http://myname.mysite.com/index.php http://myname.mysite.com/about.php http://myname.mysite.com/articles.php

Таким образом, посетители будут думать, что они работают с отдельным сайтом myname.mysite.com, но вНа самом деле, посетители будут работать на веб-страницах mysite.com.Поэтому, если я изменю контент на mysite.com, этот контент будет изменен на myname.mysite.com.

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

Я думаю, я пытался объяснить, что я хочу сделать.Боже, старайся объяснить эту ситуацию.Ах, забыл упомянуть, все это я хочу сделать на PHP.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Если на самом деле будет только один (или только несколько) крошечных (-ых) параметров (-ов), которые (-ы) различаются в поддоменах, вам, вероятно, следует рассмотреть возможность обслуживания всех поддоменов из одного и того же корневого документа / веб-узла.Сделайте это с настройкой вашей конфигурации vhost.В Apache это будет выглядеть примерно так (предполагается, что NameVirtualHost *:80):

<VirtualHost *:80>
  ServerName mysite.com
  ServerAlias *.mysite.com
  DocumentRoot /var/www/websites/mysite
</VirtualHost>

Затем из своего кода вы можете определить, какие настройки использовать (или переопределить), используя поддомен, который может быть определен какИтак:

$domain = !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
$subdomain = implode('.', explode('.', $domain, -2));

Затем используйте $subdomain, чтобы определить, какие настройки использовать.

Я не собираюсь приводить пример кода, как вы можете определить, какие настройки использовать для данного субдоменапотому что ваш выбор реализации очень субъективен к вашим потребностям.


РЕДАКТИРОВАТЬ - в ответ на вопрос от OP в первом комментарии

Если вы абсолютно не можетепоместите ServerAlias *.mysite.com в вашу конфигурацию vhost, тогда все равно может быть простой способ заставить все работать аналогичным образом: используйте символические ссылки для корня документа / корня.

Так что, если myname.mysite.com имеет документ /веб-корень /var/www/websites/myname.mysite.com и mysite.com имеет документ / веб-корень /var/www/websites/mysite.com

Затем создайте / var / www / sites/myname.mysite.com символическая ссылка на /var/www/websites/mysite.com на веб-сервере:

cd /var/www/websites/
ln -s mysite.com myname.mysite.com

Это должно привести к тому, что файлы, используемые / обслуживаемые Apache для myname.mysite.com, будут получены изто же расположение на сервере, что и для mysite.com.


EDIT - для cPanel

Хорошо, теперь я убежден, что cPanel хромает.

Если у вас уже включен mod_proxy, вы можете сделать это в каждом корне .htaccess

RewriteRule ^([^/]*)(/?)(.*) http://mysite.com/$1$2$3 [L,P]

Конечно, это даже не учитывает запросы, поступающие через https.Вы можете избежать использования mod_proxy, направляя все запросы к символической ссылке в корне web / document для myname.mysite.com, НО, что возвращает нас к вопросу создания символических ссылок.Возможно, было бы проще получить символические ссылки в корнях документа / веб-узла, чем создавать сами символические ссылки на корни документа / веб-сайта.

Надеюсь, это дало вам некоторые идеи.Похоже, вам нужно будет сделать что-то помимо того, что предоставляет cPanel, чтобы все работало так, как вы этого хотите.

1 голос
/ 29 марта 2012

Если единственное, что вы хотите изменить, это файл inc.php, я бы предложил структурировать его немного по-другому (в приведенном ниже коде предполагается, что существуют только субдомены 1-го уровня, такие как subdomain.mysite.com, и некоторые изменения в точках) и (4) понадобятся для более глубоких поддоменов, таких как sub.subdomain.mysite.com).

1) В конфигурации вашего виртуального хоста apache определите все субдомены, которые будут псевдонимами для основного домена:

<VirtualHost *:80>
    ...

    SernarName mysite.com
    ServerAlias *.mysite.com

    ...
</VirtualHost>

2) Соберите все свои файлы PHP для всех поддоменов в одном каталоге и укажите конфигурацию apache на этот каталог.

3) В этом каталоге создайтекуча inc файлов: inc.php, inc-subdomain1.php, inc-subdomain2.php и т. д.

4) Иметь какой-то файл config.php, который вы включаете из всех других файлов на вашем сайте,и пусть он содержит что-то вроде этого:

if(isset($_SERVER['HTTP_HOST'])) {
    $host = explode('.', strtolower($_SERVER['HTTP_HOST']));
    if(count($host) == 3) {   //have something more than just mysite.com
        $subdomain = $host[0];
        if($subdomain == 'www') {     //www.mysite.com is the same as just mysite.com
            $subdomain == '';
        }
    }
    else {      //if just mysite.com, then no subdomains
        $subdomain = '';
    }
}
else {  //if no http_host info exists, then assume it's just mysite.com
    $subdomain = '';
}

$incfile = 'inc' . ($subdomain == '' ? '' : "-$subdomain") . '.php';
if(!file_exists($incfile)) {    //if no include file for the requested subdomain, just use mysite.com
    $incfile = 'inc.php';
}

require_once($incfile);

Теперь все это, конечно, даст вам большую гибкость, но может не потребоваться, если все, что вам нужно, это просторазные номера ICQ.В этом случае я бы изменил код пункта (4), чтобы в нем был только 1 включаемый файл, скажем, inc.php, и в этом файле есть что-то вроде этого:

$icq_default = '111-111';
$icq_nums = array('subdomain1' => '222-222',
                  'subdomain2' => '333-333',
                  ...);

if(isset($_SERVER['HTTP_HOST'])) {
    $host = explode('.', strtolower($_SERVER['HTTP_HOST']));
    if(count($host) == 3) {   //have something more than just mysite.com
        $subdomain = $host[0];
        if($subdomain == 'www') {     //www.mysite.com is the same as just mysite.com
            $subdomain == '';
        }
    }
    else {      //if just mysite.com, then no subdomains
        $subdomain = '';
    }
}
else {  //if no http_host info exists, then assume it's just mysite.com
    $subdomain = '';
}

$required_number = isset($icq_numbers[$subdomain]) ? $icq_numbers[$subdomain] : $icq_default;
...