cr: subdomains via php anlegen

hallo zusammen,

ich bin bei einem hoster, der mir unbegrenzt subdomains mitliefert. weiß von euch zufällig jemand, ob es technisch möglich ist, mit einem einfachen php script eine subdomain anzulegen und auch gleich festzulegen, wohin diese zeigen soll?

danke für eure hilfe

cr

  1. Hi cr,

    ich bin bei einem hoster, der mir unbegrenzt subdomains mitliefert. weiß von euch zufällig jemand, ob es technisch möglich ist, mit einem einfachen php script eine subdomain anzulegen und auch gleich festzulegen, wohin diese zeigen soll?

    Natürlich ist das „möglich”, die Frage ist lediglich, ob in einer aktzeptablen Zeit realisierbar ist. Um das zu beantworten musst du uns aber schon sagen, auf welche Art und Weise dein Provider dich Subdomains anlegen lässt.

    Auf einem eigenen Root-Server kannst du mit PHP-Scripts problemlos VirtualHosts anlegen (macht z.B. eine Software von mir, mit welcher ich meinen Server verwalte). Wenn dein Provider Confixx, Plesk oder etwas in dieser Richtung benutzt, dann könnte man mit PHP einen Browser nachprogrammieren, welcher dieses Web-Interface bedient, was aber u.U. etwas komplex werden kann.

    Viele Grüße,
      ~ Dennis.

    1. hi dennis,

      ja er nutzt confixx. was heißt umfangreich? kannst du mir kurz die schritte erläutern, die nötig wären? danke für deine hilfe

      1. Hi cr,

        ja er nutzt confixx. was heißt umfangreich? kannst du mir kurz die schritte erläutern, die nötig wären?

        Nun ja, dein PHP-Script müsste:

        • erst mal die Login-Seite aufrufen und sich dabei ein Session-Cookie setzen lassen
        • sich einloggen, indem es die Login-Daten sendet
        • die Seite aufrufen, auf welcher man Subdomains anlegen kann
        • ein Abschicken des dortigen Formulars simulieren, mit der gewünschten Subdomain
        • eventuell noch Prüfen, ob das Anlegen erfolgreich war
        • eventuell noch Ausloggen

        Das zu programmieren ist nicht gerade wenig Arbeit, aber es ist auch keinesfalls unmöglich, vorausgesetzt, du hast bereits Erfahrungen in PHP und kennst dich auch etwas mit HTTP aus (mit HTML natürlich sowieso).

        Wie gehst du dazu am besten vor? Nun, ich würde dir empfehlen, Firefox mit der LiveHTTPHeaders-Extension zu installieren, dort kannst du mal den kompletten Traffic mitprotokollieren, wenn du von Hand eine Subdomain anlegst. Und alles was du dort mitgeloggt hast, musst du im Prinzip mit PHP nachbauen, also alles was Firefox mit dem Server „gesprochen” hat, genauso musst auch du mit dem Server kommunizieren.

        Soweit die Theorie… Jetzt musst du ja aber nicht zwangsläufig das Rad neu erfinden, wenn das doch schon Hunderte von Leuten vor dir getan haben. Nicht, dass jetzt unbedingt schon mal jemand in Confixx eine Subdomain anlegen wollte, aber HTTP-Requests mit PHP abzusetzen, das haben wirklich schon genug Leute gemacht (ich übrigens auch *g*) und deshalb wirst du dafür auch ein paar fertige Klassen finden. Spontan würde ich dir vom Zend Framework die Komponente Zend_Http und davon insbesondere die Klasse Zend_Http_Client ans Herz legen wollen.

        So könnte das ungefähr aussehen:

        // unter welcher Adresse ist Confixx zu erreichen?  
        $confixxURL  = 'http://example.org';  
        $confixxUser = 'webXX';  
        $confixxPass = 'dein-passwort';  
          
        // neuen Zend_Http_Client erstellen  
        require_once('Zend/Http/Client.php');  
        $client = new Zend_Http_Client();  
          
        // Einstellungen für den HTTP-Clienten vornehmen  
        $client->setConfig(array(  
          # Timeout für Verbindungsaufbau sind 20 Sekunden  
          'timeout' => 20,  
          # User-Agent kannst du setzen wie du willst ;-)  
          'useragent' => 'PHP ' . PHP_VERSION . ' with Zend Framework',  
          # Verbindung soll offengehalten werden, da wir mehrere  
          # Requests absetzen wollen (bessere Performance)  
          'keepalive' => true  
        ));  
          
        // CookieJar aktivieren, damit regelt Zend_Http_Client das  
        // Senden und Empfangen von Cookies vollautomatisch  
        $client->setCookieJar();  
          
        // zuerst rufen wir mal die normale Login-Seite auf, dabei  
        // kriegen wir ein Session-Cookie  
        $client->setUri($confixxURL . '/user/index.php');  # URL setzen  
        $client->request(Zend_Http_Client::GET);  # GET-Request durchführen  
          
        // nun müssen wir Benutzername und Passwort an den Server  
        // senden, betrachtet man den HTML Quelltext von Confixx stellt  
        // man schnell fest, wie die nötigen Formularfelder heißen  
        $client->setUri($confixxURL . '/login.php');  
        $client->setParameterPost('username', $confixxUser);  
        $client->setParameterPost('password', $confixxPass);  
        $response = $client->request(Zend_Http_Client::POST);  
          
        // schauen wir uns mal die Response an, ob wir eingeloggt sind  
        if(strstr($response->getBody(), 'Bitte Einloggen') !== false) {  
          // ich prüfe die HTML-Seite auf den String "Bitte einloggen", welcher  
          // in der Loginmaske von Confixx vorkommt, jedoch nicht auf der Seite,  
          // nachdem man eingeloggt ist.  
          die('Login fehlgeschlagen!');  
        }  
          
        // nun rufen wir die Domains-Seite auf, die URL davon rauszukriegen mag  
        // etwas trickig sein *g*  
        // Tip: Rechtsklick -> Aktueller Frame -> Frame-Informationen anzeigen  
        $client->setUri($confixxURL . '/user/' . $confixxUser . '/tools_domains.php');  
        $client->request(Zend_Http_Client::GET);  
          
        // Jetzt musst du eigentlich nur noch das Formular für die Subdomain  
        // ausfüllen ;-)  
        $client->setUri($confixxUrl . '/user/' . $confixxUser . '/tools_domains_neu.php');  
        $client->setParameterPost('prefix', 'foobar');  # für foobar.example.org  
        $client->setParameterPost('domain', 'example.org');  
        $client->setParameterPost('pfad', '/pfad/fuer/document/root');  
        $client->setParameterPost('cur_page', 'tools_domains.php');  
        $client->setParameterPost('action', 'new');  
        $client->setParameterPost('bname_ok', '');  
        $client->request(Zend_Http_Client::POST);  
          
        // und jetzt am besten noch prüfen, ob das mit der Subdomain auch  
        // geklappt hat, bei Bedarf im Anschluss hieran direkt noch weitere  
        // Subdomains anlegen
        

        Kleine Warnung am Rande: Ich habe das jetzt nur nebenbei runtergeschrieben, du solltest das also als einen Entwurf sehen, keine Garantie dafür, dass es auf Anhieb funktioniert ;-)

        Ich habe das jetzt unter Betrachtung eines Servers mit Confixx Professional entwickelt, möglicherweise ist es anders, wenn du eine andere Version von Confixx hast.

        Zum Analysieren der HTML-Formulare, die du Umsetzen musst, möchte ich dir noch Web Developer empfehlen, dort die Funktion Forms -> Display Form Details. Sehr praktisch ;-)

        Viele Grüße,
          ~ Dennis.

  2. Hallo cr,

    Vorschlag:

    • versuche mit PHP die 'httpd.conf' zu lesen
        - falls das nicht geht, lies woanders weiter ...
    • versuche mit PHP in der 'httpd.conf' zu schreiben
        - falls das nicht geht, lies woanders weiter ...
    • suche nach einem Abschnitt der Form:
          <VirtualHost *>
               ServerName uris.npf
               ServerAdmin webmaster@uris.npf
               ErrorLog logs/error.log
               CustomLog logs/access.log common
               DocumentRoot /home/yxcvb/web/slds/uris
          </VirtualHost>
    • wenn Du diesen nicht findest, suche in anderen *.conf-Files danach
    • kopiere den Abschnitt und modifiziere ihn nach Deinen Wünschen
    • füge ihn mit PHP in die *.conf-File ein
    • löse einen Reboot des Apache aus
    • falls das SO nicht geht, lies woanders weiter ... ;-)

    mbG Rolf

    1. Hi Rolf,

      • falls das SO nicht geht, lies woanders weiter ... ;-)

      Dein Vorschlag ist natürlich korrekt, dürfte für cr allerdings nicht umsetzbar sein, da er bereits davon sprach, dass sein Provider Confixx zur Administration einsetze - Zugriff auf die httpd.conf, geschweige denn Root-Rechte schließe ich also mal aus ;-)

      Viele Grüße,
        ~ Dennis.

      1. Hallo Dennis,

        Dein Vorschlag ist natürlich korrekt, dürfte für cr allerdings nicht umsetzbar sein, da er bereits davon sprach, dass sein Provider Confixx zur Administration einsetze - Zugriff auf die httpd.conf, geschweige denn Root-Rechte schließe ich also mal aus ;-)

        logo,
        desderwegen hatte ich Abbruchbedingungen eingebaut.

        Wobei sich das alles doch wieder selbst ins Knie schiesst.
        Wenn man die httpd.conf weder lesen noch schreiben darf, aber Zugriff auf Confixx bekommt, sieht das für mich irgendwie inkonsequent aus, wobei ich zugeben muss, dass ich mich mit Confixx nicht wirklich auskenne. Vielleicht hat das ja eine mächtige Rechteverwaltung, von der ein Shellwurm gar keine Vorstellung hat ... ;-)

        mbG Rolf

        1. Hi Rolf,

          Wobei sich das alles doch wieder selbst ins Knie schiesst. Wenn man die httpd.conf weder lesen noch schreiben darf, aber Zugriff auf Confixx bekommt, sieht das für mich irgendwie inkonsequent aus

          Ich wollte die Betonung auf „sein Provider” legen, er scheint keinen eigenen Server zu besitzen, sondern lediglich Webspace bei einem Provider gemietet zu haben. Der Provider selber hätte natürlich Zugriff auf die httpd.conf, aber als Kunde kannst du nur in Confixx Domains anlegen etc. und Confixx realisiert dies dann im Hintergrund mit Root-Rechten, sprich Confixx bearbeitet dann für die die httpd.conf o.ä.

          Vielleicht hat das ja eine mächtige Rechteverwaltung, von der ein Shellwurm gar keine Vorstellung hat ... ;-)

          Oh ja, Confixx ist grauenhaft ;-)

          Viele Grüße,
            ~ Dennis.