tim: Domains ausschließen. robots.php

Hi,
ich habe im Thread:
http://forum.de.selfhtml.org/archiv/2003/11/62456/#m353215

folgendes gefunden und habe dies abgeändert so dass keine subdomains in die suchmaschinen aufgenommen werden:

<script language="php">

@header("Content-Type: text/plain; charset=iso-8859-1");
$serververlangt=$_SERVER["HTTP_HOST"];
$urlrest=$_SERVER["REQUEST_URI"];
$kompletturl=$serververlangt.$urlrest;

if ($kompletturl=="www.meinedomain.de/robots.txt")
{
     print ("\n");
   if ($urlrest=="/robots.txt")
    {
     print ("User-agent: *\n");
     print ("Disallow: /\n\n");
    }
   print ("# Nur Seiten unter http://www.meinedomain.de/ sollen durchsucht\n");
   print ("# und indiziert werden.\n\n");
  }

print ("# Verlangt: http://$kompletturl\n");

print ("\n");

</script>

sollte es so funktionieren??
Bzw was muss ich tun, wenn ich mehrere Domains habe und all diese Domains gelistet werden sollen bis auf die Subdomains.
Also indiziert werden sollen alle seiten die mit www.meinedomain.de und www.meinedomain.com anfangen.
test.meinedomain.de, andere subdomains und andere urls von mir sollen nicht indiziert werden.
Wie mache ich dies?

Ich hoffe Ihr könnt mir weiterhelfen.
Vielen Dank.
tim

  1. Hi,

    sollte es so funktionieren??

    betrachte die Ergebnisse(!) der unterschiedlichen http://hostname/robots.txt und urteile selbst.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    sollte es so funktionieren??

    Wie schon cheatah schrieb: Probier es einfach aus.

    Bzw was muss ich tun, wenn ich mehrere Domains habe und all diese Domains gelistet werden sollen bis auf die Subdomains.

    Statt nur zu schauen, ob die URL genau mit einem String
    identisch ist, musst Du schauen, ob sie in einer Menge
    von "erlaubten" URLs enthalten ist oder nicht.

    Wenn ja, gibst Du die "erlaubt" Variante der robots.txt aus,
    wenn nein, die "verboten" Variante.

    Das geht z.B. mit einer SWITCH/CASE Konstruktion,
    oder auch mit einem assoziativen Array, z.B. so:

    unset($ok);
    $ok["www.example.org/robots.txt"]=true;
    $ok["www.example.net/robots.txt"]=true;
    $ok["www.example.com/robots.txt"]=true;
    $ok["tests.example.com/robots.txt"]=true;

    if (isset($ok[$kompletturl]))
      { /* "Erlaubt" Variante */ }
    else
      { /* "Verboten" Variante */ }

    ---

    Du solltest in Beispielen nicht www.meinedomain.de verwenden,
    sondern www.example.com.
    meinedomain.de kann jemandem gehoeren, example.com/.org/.net
    sind explizit fuer Beispiele vorgesehen.

    Gruesse,

    Thomas

    P.S. Wie Du aus einer URL einen klickbaren Link machen kannst,
    steht in der FAQ: </faq/#Q-19>

    1. sorry ich kenn mich nicht arg gut mit php aus.

      Also ich stecke das in eine php Datei:

      unset($ok);
      $ok["www.example.org/robots.txt"]=true;
      $ok["www.example.net/robots.txt"]=true;
      $ok["www.example.com/robots.txt"]=true;
      $ok["tests.example.com/robots.txt"]=true;

      if (isset($ok[$kompletturl]))
        { /* "Erlaubt" Variante */ }
      else
        { /* "Verboten" Variante */ }

      wieso bei ok immer die domain mit robots.txt? muss man diese mit robots.txt angeben? Oder bei ok einfach alle meine domains also example.de, example.com ?? oder weshalb muss die robots.txt da hinter noch stehen?
      Wenn ich die erlaubten Varianten eingegeben habe, dann muss ich doch eigentlich keine Verbotenen Varianten einfügen, da er ja eh nur die erlaubten nehmen soll.
      Verbotene gibt es ja einige..
      kann ich die Zeile else dann weglassen??

      1. Hallo,

        sorry ich kenn mich nicht arg gut mit php aus.

        Dann lerne es ;-)

        Wenn Du einen bestimmten Schritt in meinem Skript nicht verstehst,
        frag nach.

        $ok["www.example.org/robots.txt"]=true;
        $ok["www.example.net/robots.txt"]=true;

        wieso bei ok immer die domain mit robots.txt? muss man diese mit robots.txt angeben? Oder bei ok einfach alle meine domains also example.de, example.com ?? oder weshalb muss die robots.txt da hinter noch stehen?

        Man koennte durchaus einfach nur den Server-Teil der URL beachten.
        Ich habe mich fuer die vollstaendige URL entschieden.
        Das ist Geschmackssache.

        Ich gehe davon aus, dass man folgendes anschauen will:
        Die vollstaendige URL, die der Client/Robot angefordert hat.

        So definiere ich ja die Variable $kompletturl:
        $serververlangt=$_SERVER["HTTP_HOST"];
        $urlrest=$_SERVER["REQUEST_URI"];
        $kompletturl=$serververlangt.$urlrest;

        Dort soll also z.B. drinstehen:
        www.example.com/robots.txt

        Und mit dieser Variable mache ich spaeter den Vergleich,
        d.h. ich schaue, ob es ein Array-Element mit diesem
        Schluessel gibt oder nicht.

        Wie gesagt, koennte man stattdessen auch eine
        SWITCH/CASE Konstruktion nehmen.
        Die Array-Loesung ist einfach etwas kompakter.

        Wenn ich die erlaubten Varianten eingegeben habe, dann muss ich doch eigentlich keine Verbotenen Varianten einfügen, da er ja eh nur die erlaubten nehmen soll.
        Verbotene gibt es ja einige..
        kann ich die Zeile else dann weglassen??

        Du begreifst offenbar nicht, was Du tun willst.

        Und Du begreifst nicht, dass die robots.txt dazu da ist,
        Dinge zu verbieten, und nicht, Dinge zu erlauben.
        Die Robots verhalten sich nach dem Grundsatz:
        "Was nicht verboten ist, ist erlaubt".

        Du willst doch, dass, wenn ein Robot
        subdomain2.example.com/robots.txt
        verlangt, er ein Verbot kriegt, irgendetwas auf diesem "Server"
        (subdomain2.example.com) zu besuchen.

        Gerade das _Verbot_ musst Du explizit in der
        robots.txt aussprechen.
        => Gerade der _else_ Teil ist entscheidend.

        Im _if_ Teil koenntest Du auch einfach "nichts" ausgeben.
        Dann geht der Robot davon aus, dass er auf diesem "Server"
        alles besuchen darf.

        Das _Skript_ geht also von der Idee aus:
        Was nicht ausdruecklich erlaubt ist, ist verboten.
        Bei allen nicht definierten (Sub-)Domains
        wird den Robots ein "Verbot" ausgeliefert.

        Gruesse,

        Thomas

        1. Vielen Dank schon mal.
          ehrlich gesagt kann ich so gut wie 0 php und benötige php ja ansonsten auch nicht. Aber es wird wohl die einzigste Möglichkeit sein um zu verbieten, dass Subdomains.. indiziert werden.

          Also so wie ich es verstehe sieht dein Script ausfürhlich so aus:
          $kompletturl:
          $serververlangt=$_SERVER["HTTP_HOST"];
          $urlrest=$_SERVER["REQUEST_URI"];
          $kompletturl=$serververlangt.$urlrest;

          unset($ok);
          $ok["www.example.org/robots.txt"]=true;
          $ok["www.example.net/robots.txt"]=true;
          $ok["www.example.com/robots.txt"]=true;
          $ok["tests.example.com/robots.txt"]=true;

          if (isset($ok[$kompletturl]))
            { /* "Erlaubt" Variante */ }
          else
            { /* "Verboten" Variante */ }

          dann sind die 4 Domains erlaubt und alle anderen werden nicht erlaubt.
          Oder verstehe ich dies falsch?
          Also muss ich dann alle meine Domains und Subdomains die indiziert werden
          sollen so angeben wie oben.
          Benötige ich dann noch eine robots.txt?? Oder mache ich dies und
          schreibe in die robots.txt dann rein dass er alles verfolgen darf.
          Versteh das nicht ganz.

          Danke schon mal.
          tim

          1. Hallo,

            Also so wie ich es verstehe sieht dein Script ausfürhlich so aus:
            $kompletturl:

            Diese Zeile natuerlich nicht.

            Der Rest ist dann OK.
            Natuerlich musst Du eben in den entsprechenden Abschnitten
            (if/else) den gewuenschten Text ausgeben, z.B. mit echo()
            oder print(). Zeilenumbrueche gibt es mit "\n".

            Als Alternative koenntest Du auch zwei statische Dateien
            schreiben und ins gleiche Verzeichnis hochladen,
            z.B. robots-ok.txt und robots-verboten.txt
            Dann steht im PHP-Skript an der betreffenden Stelle nur:

            if (isset($ok[$kompletturl]))
              { readfile("robots-ok.txt"); }
            else
              { readfile("robots-verboten.txt"); }

            Mit dem Befehl readfile() wird einfach der Inhalt
            der Datei "wie sie ist" an den Browser ausgegeben.
            http://www.php.net/manual/de/function.readfile.php

            Lies nochmal meinen Vorschlag im Archiv:
            http://forum.de.selfhtml.org/archiv/2003/11/62456/#m353215
            (Wenn's gerade nicht klappt, warte ein paar Minuten.)
            Das Skript muss als einziger Inhalt in einer robots.php stehen.
            Ganz am Anfang dieses Skripts muss in den PHP-Modus gewechselt
            werden, entweder mit
            <script language="php">
            oder mit
            <?php

            Am Ende muss entsprechend stehen:
            </script>
            bzw.
            ?>

            Und als erste Ausgabe an den Client sollte das Skript
            den HTTP-Header mit dem Content-Type text/plain schicken,
            damit nicht (gemaess der Standard-Konfiguration) text/html
            geschickt wird.

            dann sind die 4 Domains erlaubt und alle anderen werden nicht erlaubt.
            Also muss ich dann alle meine Domains und Subdomains die indiziert werden
            sollen so angeben wie oben.

            Genau.
            Eine Zeile pro erlaubte (Sub)Domain.

            Benötige ich dann noch eine robots.txt??

            Nein. Aber Du musst dem Webserver mit der .htaccess
            im Hauptverzeichnis beibringen, dass er, wenn der
            Client (Robot, Browser) die Datei robots.txt verlangt,
            stattdessen die robots.php schickt.
            Auch das steht im erwaehnten Posting im Archiv, wo
            ich diese Methode zum ersten Mal vorgeschlagen hatte.

            Das ganze setzt voraus, dass mod_rewrite zur Verfuegung steht.
            (Das haengt von Deinem Provider ab.)

            Domain-uebergreifend kann es uebrigens dazu kommen,
            dass der Server einen 302-Header schickt, also eine
            Umleitung, und dass dann auch der Client mitkriegt,
            dass er auf eine robots.php umgeleitet wurde.

            ---

            Apache-Profis werden ab dem ganzen PHP-Gebastel sicher die
            Nase ruempfen. Wenn man genug von Apache, mod_rewrite,
            virtuellen Servern und Subdomains versteht, kann man
            das Ziel sicher auch ohne PHP erreichen.

            Fuer mich war es einfach eine schnelle und einfache Loesung,
            die fuer meine Zwecke reicht. Von PHP verstehe ich nun mal
            mehr als von raffinierter Apache-Konfiguration.
            Und ich habe auch nur einen gemieteten Webspace
            mit eingeschraenkten Moeglichkeiten, was Domains
            und Subdomains angeht.

            Im Einsatz habe ich das ganze hier:
            http://www.tiptom.ch/robots.txt vs. http://tiptom.ch/robots.txt

            Wenn ich nichts dagegen unternehme, ist die gleiche Ressource
            unter mindestens 5 verschiedenen URLs erreichbar:

            (a) http://www.domain1.test/img/bild.jpg
            (b) http://domain1.test/img/bild.jpg

            (c) http://www.domain2.test/domain1/img/bild.jpg
            (d) http://domain2.test/domain1/img/bild.jpg

            (e) http://domain1.domain2.test/img/bild.jpg

            (a) ist die gegen aussen erwuenschte URL, die z.B.
                als einzige von den Suchmaschinen indiziert werden soll.
            (c)/(d) ist die "echte" URL auf Filesystem-Ebene.
            (e) ist ein offenbar notwendiger Zwischenschritt
                in der Rewrite/Mapping-Reihenfolge meines Webhosters.

            Ich bezahle grundsaetzlich fuer domain2,
            kriege aber das "Mapping" fuer domain1 gratis.
            Das ganze Theater mit verschiedenen robots.txt
            musste ich aufziehen, weil Google ploetzlich
            anfing, (e) auch zu indizieren.

            Gruesse,

            Thomas

            P.S. Der Vollstaendigkeit halber (und fuer Apache-Benutzer):

            Natuerlich koennte man auch die robots.txt selbst zu
            einem ausfuehrbaren PHP-Skript machen.

            In der .htaccess im Hauptverzeichnis:
            AddType application/x-httpd-php .txt
            Damit werden alle .txt-Dateien durch den PHP-Parser geschickt.

            In allen Unterverzeichnissen braucht es dann aber
            wieder eine .htaccess, die das aufhebt:
            AddType text/plain .txt
            Damit werden .txt-Dateien wieder normal behandelt,
            d.h. direkt als text/plain an den Client ausgeliefert.

            Weitere Alternative:
            Die Datei robots.txt.php nennen und den Server so
            konfigurieren, dass er die Datei auch anzeigt,
            wenn robots.txt verlangt wird.
            Dies koennte vielleicht mit folgender Zeile in der .htaccess
            geschehen - sofern die Server-Konfiguration es zulaesst:
            Options +MultiViews
            Siehe
            http://httpd.apache.org/docs/mod/core.html#options
            http://httpd.apache.org/docs/content-negotiation.html
            http://httpd.apache.org/docs/mod/mod_negotiation.html

            1. Das ganze setzt voraus, dass mod_rewrite zur Verfuegung steht.
              (Das haengt von Deinem Provider ab.)

              Providermäßig ist es kein Problem. Habe beim Provider nachgefragt wg der Sache in der htaccess ändern und hab die Funktion freigeschaltet bekommen.

              Danke schon mal. Irgendwie verwirrst du mich mit den vielen Alternativen ;-)

              Also
              ich füge jetzt:

              @header("Content-Type: text/plain; charset=iso-8859-1");
              $serververlangt=$_SERVER["HTTP_HOST"];
              $urlrest=$_SERVER["REQUEST_URI"];
              $kompletturl=$serververlangt.$urlrest;

              if ($kompletturl=="www.meinedomain.de/robots.txt")
              {
                   print ("\n");
                 if ($urlrest=="/robots.txt")
                  {
                   print ("User-agent: *\n");
                   print ("Disallow: /\n\n");
                  }
                 print ("# Nur Seiten unter http://www.meinedomain.de/ sollen durchsucht\n");
                 print ("# und indiziert werden.\n\n");
                }

              print ("# Verlangt: http://$kompletturl\n");

              print ("\n");

              if ($kompletturl=="www.meinedomain.de/robots.txt")
              verstehe ich nicht ganz...wieso /robots.txt wenn es gar keine robots.txt geben soll.
              Kannst du es mir nicht ein bischen verständlicher Formulieren??
              Sorry aber ich hab 0 Ahnung von PHP..

              tim

              1. Hallo,

                Danke schon mal. Irgendwie verwirrst du mich mit den vielen Alternativen ;-)

                Das habe ich befuerchtet. ;-)

                Die Sache ist auch nicht trivial, denn sie vermischt
                einige Dinge (HTTP, Apache-Konfiguration, PHP).

                Das PHP-Skript an sich ist jedoch IMHO ziemlich einfach.

                Das vollstaendige Skript solltest Du als robots.php
                in Deinem Hauptverzeichnis speichern.
                Es sollte etwa so aussehen (alles zwischen den ----):

                ----
                <script language="php">

                @header("Content-Type: text/plain; charset=iso-8859-1");

                $serververlangt=$_SERVER["HTTP_HOST"];
                $urlrest=$_SERVER["REQUEST_URI"];
                $kompletturl=$serververlangt.$urlrest;

                unset($ok);
                $ok["www.example.org/robots.txt"]=true;
                $ok["www.example.net/robots.txt"]=true;
                $ok["www.example.com/robots.txt"]=true;
                $ok["tests.example.com/robots.txt"]=true;

                if (isset($ok[$kompletturl]))
                  {
                   print ("\n");
                   print ("User-agent: *\n");
                   print ("Disallow: /bilder\n\n");
                   print ("# Alles andere darf von allen besucht werden... \n");
                  }
                else
                  {
                   print ("\n");
                   print ("User-agent: *\n");
                   print ("Disallow: /\n\n");
                   print ("# Nur Seiten unter http://www.example.com/ sollen durchsucht\n");
                   print ("# und indiziert werden.\n\n");
                  }

                print ("# Verlangt: http://$kompletturl\n");
                print ("\n");
                </script>
                ----

                Alle ausgegebenen Zeilen, die mit # anfangen, insbesondere
                auch die letzte ("# Verlangt:...") sind bloss Kommentare.
                Man koennte sie auch weglassen.

                ---

                Der Ordner /bilder ist nur eine "Verlegenheitsloesung",
                um ueberhaupt etwas zu sperren. Wenn man gar nichts sperren will,
                kann der IF-Teil auch leer sein:

                if (isset($ok[$kompletturl]))
                 { }
                else
                 {
                  print ("User-agent: *\n");
                  print ("Disallow: /\n\n");
                 }

                Weil ein leerer IF-Teil nicht gerade sinnvoll ist,
                kann man auch die Bedingung umkehren ("!" ist logisch NOT)
                und den Verbots-Teil in den IF-Teil verschieben.
                Statt IF/ELSE hat man dann nur noch IF:

                if (!isset($ok[$kompletturl]))
                 {
                  print ("User-agent: *\n");
                  print ("Disallow: /\n\n");
                 }

                if ($kompletturl=="www.example.com/robots.txt")
                verstehe ich nicht ganz...wieso /robots.txt wenn es gar keine robots.txt geben soll.

                Das hat nichts mit PHP zu tun.
                Sondern mit HTTP, Apache und mod_rewrite.

                Der Client (Browser, Robot) verlangt die Ressource mit der URL:
                http://www.example.com/robots.txt
                _Diese_ URL ist interessant, weil Du ja wissen willst,
                was der Client _verlangt_ hat.

                Durch "schmutzige Tricks" auf Server-Ebene (mod_rewrite)
                wird dem Client aber nicht die Datei robots.txt geliefert
                (die gibt's naemlich gar nicht), sondern die Datei robots.php

                Zumindest solange alles innerhalb der gleichen Domain passiert,
                kriegt der Client aber nichts davon mit.

                Kannst du es mir nicht ein bischen verständlicher Formulieren??
                Sorry aber ich hab 0 Ahnung von PHP..

                Dann solltest Du es auch nicht verwenden.
                Du solltest nur Dinge anwenden, von denen Du verstehst, was sie tun.

                Also das ABC kann ich Dir nicht beibringen.
                Lies die dclp-FAQ http://www.dclp-faq.de/
                und die wichtigsten Teile des Manuals
                http://www.php.net/manual/de/
                z.B.:
                http://www.php.net/manual/de/getting-started.php
                http://www.php.net/manual/de/langref.php
                http://www.php.net/manual/de/control-structures.php
                http://www.php.net/manual/de/ref.strings.php
                Um die Sache mit dem Array zu verstehen:
                http://www.php.net/manual/de/language.types.array.php
                http://www.php.net/manual/de/function.isset.php

                Fuer Anfaenger soll auch "Schattenbaum" ganz brauchbar sein:
                http://www.schattenbaum.net/php/

                ---

                Zur Apache-Konfiguration und mod_rewrite:
                http://httpd.apache.org/docs/mod/mod_rewrite.html
                http://httpd.apache.org/docs/misc/rewriteguide.html
                Manchmal reicht statt mod_rewrite auch mod_alias:
                http://httpd.apache.org/docs/mod/mod_alias.html
                Doch diese Dinge sind fuer mich immer noch ein Buch
                mit 6 Siegeln (d.h. ein winziges Bisschen davon verstehe
                ich und wende ich an, aber den Grossteil noch nicht...)

                Gruesse,

                Thomas

                1. ok danke!!
                  Ich hoff ich werds hinbekommen.

                  Sieht irgendwie nur komisch aus, wenn keine robots.txt da ist. Da alle möglichn sich die robots.txt ansehn wolln un dann nix finden. Macht nschlechten eindruck ;-)

                  1. Hallo,

                    Sieht irgendwie nur komisch aus, wenn keine robots.txt da ist. Da alle möglichn sich die robots.txt ansehn wolln un dann nix finden. Macht nschlechten eindruck ;-)

                    Hast Du wirklich noch immer nicht begriffen,
                    dass es nach aussen nicht sichtbar ist,
                    dass Du gar keine robots.txt hast, die so heisst?

                    Oder willst Du mich jetzt auf den Arm nehmen?

                    Alle, die nicht ueber FTP, sondern ueber HTTP auf den
                    Server zugreifen und eine robots.txt verlangen,
                    kriegen auch eine.

                    Ich schwoere beim Leben meiner toten Katze:
                    Im Hauptverzeichnis von tiptom.ch ist keine Datei
                    mit dem Namen robots.txt
                    Und trotzdem kriegen die Suchmaschinen, was sie wollen:
                    http://www.tiptom.ch/robots.txt

                    Ich verstehe, dass Du nicht alles verstehst.
                    Mir geht's genauso.
                    mod_rewrite ist Voodoo. Das steht sogar im Handbuch:
                    http://httpd.apache.org/docs/mod/mod_rewrite.html

                    Gruesse,

                    Thomas