Domains ausschließen. robots.php
    
tim
    
    
      
    
  - programmiertechnik
 
0 Cheatah0 Thomas Luethi0 tim0 Thomas Luethi0 tim0 Thomas Luethi0 tim0 Thomas Luethi0 tim
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
Hi,
sollte es so funktionieren??
betrachte die Ergebnisse(!) der unterschiedlichen http://hostname/robots.txt und urteile selbst.
Cheatah
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>
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??
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
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
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
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
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
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 ;-)
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