2012-03-29 10 views
1

Jungs!Nicht Standard Situation mit Umleitung Subdomain und Domain in PHP

Ich werde erklären, was ich tun möchte. Wenn jemand dabei helfen kann, bitte geben Sie einige Ratschläge.

Ich habe eine Website, nennen wir es http://mysite.com. Und Subdomain, sagen wir http://myname.mysite.com.

Es gibt eine Konfigurationsdatei inc.php mit einigen persönlichen Daten jeweils für mysite.com und myname.mysite.com, Beispiel ICQ-Nummer. Alle allgemeinen Website-Dateien im Verzeichnis mysite.com.

Ich möchte alle allgemeinen Dateien von mysite.com in der Subdomain myname.mysite.com, um nicht völlig ähnliche Dateien bei Subdomain zu erstellen. Aber mit einer individuellen Konfigurationsdatei, die sich auf der Datei myname.mysite.com befindet und die individuelle ICQ-Nummer enthält.

Dies ist das Beispiel, wie ich das arbeiten wollen:

  1. Hauptdomäne "mysite.com" hat Stammordner "public_html" mit Seiten: index.php, about.php, articles.php und Konfigurationsdatei inc.php mit der ICQ Nummer "111-111". Wenn Sie die Website "mysite.com" aufrufen, sehen Sie dort die ICQ-Nummer von inc.php.

  2. Subdomain "myname.mysite.com" hat den Ordner "public_html/subdomain/myname" mit nur einer Konfigurationsdatei inc.php mit der ICQ Nummer "222-222". Wenn Sie also zu myname.mysite.com gehen, werden Sie die Webseiten von "mysite.com" sehen, aber die ICQ-Nummer wird von hier "public_html/subdomain/myname/inc.php" erhalten. http://myname.mysite.com/index.php http://myname.mysite.com/about.php http://myname.mysite.com/articles.php

So Besucher werden denken, dass sie einzelne Website myname.mysite sind serfing: Und in der Adresszeile werden Sie Webseiten wie sehen. com, aber in Wirklichkeit werden Besucher auf den Webseiten von mysite.com Leibeigenen. Wenn ich also den Inhalt von mysite.com ändere, wird dieser Inhalt auf myname.mysite.com geändert.

Ich brauche all diese Mitarbeiter, weil ich Partnerprogramm mit persönlichen Subdomain-Namen zu meinen Partnern organisieren möchte, aber mit persönlichen Konfigurationsdatei inc.php, die ICQ-Nummer für die Beratung nehmen wird.

Ich denke, ich habe versucht zu erklären, was ich tun möchte. Gott, tu es schwer, diese Situation zu erklären. Ah, vergaß zu erwähnen, all das möchte ich mit PHP machen.

Antwort

1

Wenn Sie nur die Datei inc.php ändern möchten, würde ich vorschlagen, sie etwas anders zu strukturieren (der folgende Code setzt nur 1-Level-Subdomains wie subdomain.mysite.com voraus, und einige Änderungen in Punkten (3) und (4) wird für tiefere Subdomains benötigt, wie subdomain.mysite.com).

1) in der Apache-Konfiguration des virtuellen Host definieren alle Subdomains Aliase für die Hauptdomäne zu sein:

<VirtualHost *:80> 
    ... 

    SernarName mysite.com 
    ServerAlias *.mysite.com 

    ... 
</VirtualHost> 

2) Haben Sie alle Ihre PHP-Dateien für alle Sub-Domains in einem Verzeichnis und Punkt Ihre Apache-Konfiguration zu diesem Verzeichnis.

3) In diesem Verzeichnis ein Bündel von inc Dateien erstellen: inc.php, inc-subdomain1.php, inc-subdomain2.php und so weiter.

4) haben eine Art von config.php-Datei, die Sie von allen anderen Dateien in Ihre Website sind, und haben es so etwas wie diese enthalten:

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); 

Nun, all dies von Kurs wird Ihnen eine Menge Flexibilität geben, aber möglicherweise nicht notwendig, wenn Sie nur die verschiedenen ICQ-Nummern benötigen. In diesem Fall würde ich Punkt ändern (4) Code hat nur 1 Include-Datei, sagt inc.php, und in dieser Datei hat ungefähr so:

$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; 
+0

Ich habe meine Antwort gepostet, bevor ich deine gelesen habe. Es ist sicher (besonders für das OP bin ich mir sicher) zu bemerken, dass wir sehr ähnliche Ansätze vorschlagen. – ghbarratt

+0

@ghbarratt Ja, in der Tat die gleichen Dinge. –

+0

@Aleks G was ist, wenn ich Shared Hosting verwende? Kein Zugriff auf vhost-Konfigurationen ändern. Vielleicht gibt es noch eine andere Variante, wie man es auf PHP-Ebene realisieren kann? kann htaccess Skript sein? – ilnur777

1

Wenn es nur wirklich geht ein (oder gerade seine ein paar) kleine Einstellungen, die über Subdomains hinweg unterschiedlich sind, sollten Sie in Betracht ziehen, alle Subdomains aus demselben Dokument/Webstamm zu bedienen. Tun Sie dies mit einer Optimierung Ihrer vhost-Konfiguration. In Apache wäre es etwa so aussehen (übernimmt NameVirtualHost *:80):

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

Dann aus dem Code, können Sie festlegen, welche Einstellungen zu verwenden (oder außer Kraft setzen) unter Verwendung der Sub-Domain, bestimmen, die wie so bestimmt werden könnten:

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

Verwenden Sie dann die $subdomain, um zu bestimmen, welche Einstellungen zu verwenden sind.

Ich werde keinen Beispielcode angeben, wie Sie anhand der Subdomain ermitteln können, welche Einstellungen verwendet werden sollen, da Ihre Implementierungsauswahl sehr subjektiv ist.


EDIT - als Antwort auf die Frage von OP in ersten Kommentar

Wenn Sie absolut nicht ServerAlias *.mysite.com in Ihre vhost Konfiguration setzen können, dann könnte es noch eine einfache Möglichkeit, die Dinge zu bekommen ähnlich sowieso arbeiten : Verwenden Sie Symlinks für die Dokument/Web-Roots.

Also, wenn myname.mysite.com das Dokument/Webstamm von /var/www/websites/myname.mysite.com und mysite.com das Dokument/Webstamm von/var/www/websites/mysite hat. com

Dann einen symbolischen Link auf /var/www/websites/mysite.com auf dem Webserver machen /var/www/websites/myname.mysite.com:

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

Dies sollte die Dateien verursacht verwendet/Wird von Apache für myname.mysite.com geliefert, um vom selben Ort auf dem Server zu kommen wie der von mysite.com.


EDIT - für cPanel

Okay, ich bin jetzt überzeugt, dass cPanel is lame.

Wenn Sie bereits mod_proxy aktiviert haben, können Sie dies in jedem root tun.htaccess

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

Natürlich berücksichtigt dies nicht einmal Anfragen über https. Sie könnten die Verwendung von mod_proxy vermeiden, indem Sie alle Anfragen an einen Symlink im Web/Document-Root für myname.mysite.com leiten, ABER das bringt uns zurück zum Thema der Erstellung von Symlinks. Es könnte einfacher sein, symbolische Links in den Dokument-/Web-Wurzeln zu erhalten, anstatt die symbolischen Links selbst zu machen.

Ich hoffe, dass dies Ihnen einige Ideen gegeben hat. Es scheint, als ob Sie etwas tun müssen, was cPanel nicht bietet, damit die Dinge funktionieren, wie Sie es wollen.

+0

Was passiert, wenn ich Shared Hosting verwende? Kein Zugriff auf vhost-Konfigurationen ändern. Vielleicht gibt es noch eine andere Variante, wie man es auf PHP-Ebene realisieren kann? kann htaccess Skript sein? – ilnur777

+0

@ ilnur777 Siehe meine bearbeitete Antwort. Wenn Sie Details zu den Verzeichnisnamen auf Ihrem Server angeben möchten, kann ich die Antwort genauer anpassen. – ghbarratt

+0

Ich benutze Shared Hosting und bin nicht berechtigt, auf irgendeine Serverkonfiguration zuzugreifen und sie zu ändern. Subdomains werden zu sehr erstellt. Wie ich das fragliche Verzeichnis angegeben habe, habe ich das Verzeichnis "public_html", in dem sich alle Dateien befinden. Alle Subdomains werden mit cPanel in diesem Verzeichnis "public_html/subdomain" erstellt. – ilnur777