Harald: htaccess

Ich habe ein Problem mit einer Domain. Auf der Domain war vorher ein wordpress blog drauf und jetzt suchen die Robots nach alten Blogeinträgen z.B. unter
meineseite.de/?p=3
meineseite.de/?p=4
etc.

Alle diese alten urls führen jetzt auf die Startseite, es wird also immer die gleiche Seite aufgerufen. Ich glaube, daß könnte ein Problem werden wegen doppeltem Content. Ich möchte nun einen 404 error ausgeben für alle anfragen mit einem /?p=irgendwas.

Kann mir jemand auf die schnelle den rewrite befehl für die htaccess sagen ?

Danke.

  1. hi

    meineseite.de/?p=3
    meineseite.de/?p=4
    etc.

    Alle diese alten urls führen jetzt auf die Startseite, es wird also immer die gleiche Seite aufgerufen. Ich glaube, daß könnte ein Problem werden wegen doppeltem Content. Ich möchte nun einen 404 error ausgeben für alle anfragen mit einem /?p=irgendwas.

    Kann mir jemand auf die schnelle den rewrite befehl für die htaccess sagen ?

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteRule ^/*.* http://www.meineseite.de/error404.html [R,L]

    was bedeutet wenn eine seite mit null byte aufgerufen wird...dann sollte diese auf error404 umgeleitet werden.
    Hoffe das hilft?
    MfG

    1. Moin!

      RewriteEngine on
      RewriteCond %{REQUEST_FILENAME} !-s
      RewriteRule ^/*.* http://www.meineseite.de/error404.html [R,L]

      was bedeutet wenn eine seite mit null byte aufgerufen wird...dann sollte diese auf error404 umgeleitet werden.
      Hoffe das hilft?

      Ein Redirect hilft nicht, weil das kein HTTP-Status 404 ist, sondern 302. Also eine existierende Seite.

      Außerdem steht der URL-Parameter der RewriteRule nicht zur Verfügung, sondern muß separat in einer RewriteCond abgehandelt werden.

      Und zu guter letzt ist der reguläre Ausdruck alles andere als korrekt: Null oder beliebig viele Schrägstriche plus Null oder beliebig viele Zeichen - was soll das sein?

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. hi,

        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-s
        RewriteRule ^/*.* http://www.meineseite.de/error404.html [R,L]

        was bedeutet wenn eine seite mit null byte aufgerufen wird...dann sollte diese auf error404 umgeleitet werden.
        Hoffe das hilft?

        Ein Redirect hilft nicht, weil das kein HTTP-Status 404 ist, sondern 302. Also eine existierende Seite.

        ist eine 404 seite nicht auch eine seite?

        Außerdem steht der URL-Parameter der RewriteRule nicht zur Verfügung, sondern muß separat in einer RewriteCond abgehandelt werden.

        hmmm versteh ich nicht

        Und zu guter letzt ist der reguläre Ausdruck alles andere als korrekt: Null oder beliebig viele Schrägstriche plus Null oder beliebig viele Zeichen - was soll das sein?

        der schrägstrich bedeutet doch alles was nach der domain
        z.B. meineseite.de/... und die *.* jede beliebig angefragte nullbyte datei...oder ist das etwa falsch?(lösung?)
        Bei mir funktionierts auf jedenfall wie hier angegeben, nur werden die nullbyte anfragen auf meine hauptseite geleitet.
        MfG
        rolfi

        1. Moin!

          Ein Redirect hilft nicht, weil das kein HTTP-Status 404 ist, sondern 302. Also eine existierende Seite.

          ist eine 404 seite nicht auch eine seite?

          Siehe https://forum.selfhtml.org/?t=176872&m=1164505 - ich will hier nicht alles doppelt schreiben.

          Außerdem steht der URL-Parameter der RewriteRule nicht zur Verfügung, sondern muß separat in einer RewriteCond abgehandelt werden.

          hmmm versteh ich nicht

          Die Frage des OP war, wie er Requests auf die URL "/" (also die Startseite) mit 404 beantwortet, an denen ein Parameter "?p=..." dranhängt. Den Parameter in der URL kann man aber in der RewriteRule nicht abfragen.

          Und zu guter letzt ist der reguläre Ausdruck alles andere als korrekt: Null oder beliebig viele Schrägstriche plus Null oder beliebig viele Zeichen - was soll das sein?

          der schrägstrich bedeutet doch alles was nach der domain

          Hängt davon ab, wo die RewriteRule platziert wird. In einer .htaccess sieht die Lage anders aus, als in festen Apache-Konfigurationsdateien.

          z.B. meineseite.de/... und die *.* jede beliebig angefragte nullbyte datei...oder ist das etwa falsch?(lösung?)

          Du bist dem Irrtum aufgesessen, dass es hier um "Datei-Wildcards" geht. Die Suchmuster sind reguläre Ausdrücke. Es gilt also kein "*.*" als Ausdruck für "alle Dateien", weil die RewriteRule gar nicht auf Dateibasis arbeitet, sondern auf URL-Basis - und außerdem haben Sterne und Punkte in der Welt der regulären Ausdrücke andere Bedeutungen!

          Bei mir funktionierts auf jedenfall wie hier angegeben, nur werden die nullbyte anfragen auf meine hauptseite geleitet.

          Das liegt daran, dass du - aber nur zufällig (!) - mit der RewriteRule pauschal einfach alle URLs erfaßt, mit der zugehörigen RewriteCond die Abfrage auf "existiert die Datei und ist sie größer als 0 Byte" filterst, und falls nein, dann ein REDIRECT auf eine Seite auslieferst, die augenscheinlich eine 404-Fehlerseite sein soll, aber bei der nirgendwo ein 404-Fehlerstatus ausgeliefert wird!

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. hi Sven,

            Außerdem steht der URL-Parameter der RewriteRule nicht zur Verfügung, sondern muß separat in einer RewriteCond abgehandelt werden.

            hmmm versteh ich nicht

            Die Frage des OP war, wie er Requests auf die URL "/" (also die Startseite) mit 404 beantwortet, an denen ein Parameter "?p=..." dranhängt. Den Parameter in der URL kann man aber in der RewriteRule nicht abfragen.

            aha, ok.

            der schrägstrich bedeutet doch alles was nach der domain

            Hängt davon ab, wo die RewriteRule platziert wird. In einer .htaccess sieht die Lage anders aus, als in festen Apache-Konfigurationsdateien.

            ok, in meinem beispiel unten auf der hauptseite.

            z.B. meineseite.de/... und die *.* jede beliebig angefragte nullbyte datei...oder ist das etwa falsch?(lösung?)

            Du bist dem Irrtum aufgesessen, dass es hier um "Datei-Wildcards" geht. Die Suchmuster sind reguläre Ausdrücke. Es gilt also kein "*.*" als Ausdruck für "alle Dateien", weil die RewriteRule gar nicht auf Dateibasis arbeitet, sondern auf URL-Basis - und außerdem haben Sterne und Punkte in der Welt der regulären Ausdrücke andere Bedeutungen!

            dann wäre sowas in der form

            RewriteEngine on
            RewriteCond %{REQUEST_FILENAME} !-s
            RewriteRule ^/*.* error404.html [R,L]

            besser? Oder wie würde man Deiner Meinung nach dateien jeglicher art, die nicht existieren mit htaccess umleiten?

            Bei mir funktionierts auf jedenfall wie hier angegeben, nur werden die nullbyte anfragen auf meine hauptseite geleitet.

            Das liegt daran, dass du - aber nur zufällig (!) - mit der RewriteRule pauschal einfach alle URLs erfaßt, mit der zugehörigen RewriteCond die Abfrage auf "existiert die Datei und ist sie größer als 0 Byte" filterst, und falls nein, dann ein REDIRECT auf eine Seite auslieferst, die augenscheinlich eine 404-Fehlerseite sein soll, aber bei der nirgendwo ein 404-Fehlerstatus ausgeliefert wird!

            genau, das stimmt.
            MfG
            rolfi

            1. Moin!

              Du bist dem Irrtum aufgesessen, dass es hier um "Datei-Wildcards" geht. Die Suchmuster sind reguläre Ausdrücke. Es gilt also kein "*.*" als Ausdruck für "alle Dateien", weil die RewriteRule gar nicht auf Dateibasis arbeitet, sondern auf URL-Basis - und außerdem haben Sterne und Punkte in der Welt der regulären Ausdrücke andere Bedeutungen!

              dann wäre sowas in der form

              RewriteEngine on
              RewriteCond %{REQUEST_FILENAME} !-s
              RewriteRule ^/*.* error404.html [R,L]

              besser? Oder wie würde man Deiner Meinung nach dateien jeglicher art, die nicht existieren mit htaccess umleiten?

              Wenn du einen Mechanismus haben willst, der prüft, ob eine angeforderte Ressource existiert und ausgeliefert werden kann, und andernfalls eine selbstgestaltete 404-Seite (mit Status 404) liefert, dann benutze folgendes:

              ErrorDocument 404 /error404.html

              Benutze KEIN Rewrite.

              Was deinen regulären Ausdruck für "alles" angeht:

              RewriteRule .* (usw.)

              Das ist vollkommen ausreichend für "alles". Der Punkt steht für "beliebiges Zeichen", der Stern für "null bis unendlich Stück". Kein "^", kein "/", kein "*.*".

              Was das Redirect angeht: Solange du am Ende der RewriteRule das [R]-Flag stehen hast, wird der Server einen Redirect auf die Seite senden, und nicht intern einfach den Inhalt austauschen.

              Aber auch ohne Flag [R] würde der Server keinen Fehlerstatus 404 senden, sondern (deswegen macht man normalerweise Rewriting) Status 200, weil erfolgreich eine Seite geliefert werden konnte.

              Für das Setzen des HTTP-Status gibts ein eigenes Flag - findest du in der Doku.

              Allerdings ist es vollkommen unnötig, sich in diesem Fall damit zu beschäftigen, da das oben angegebene ErrorDocument alles das, was die RewriteRule tun soll, viel besser und performanter erledigt.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
  2. meineseite.de/?p=3
    meineseite.de/?p=4
    etc.

    [...]

    Alle diese alten urls führen jetzt auf die Startseite, es wird also immer die gleiche Seite aufgerufen. Ich glaube, daß könnte ein Problem werden wegen doppeltem Content. Ich möchte nun einen 404 error ausgeben für alle anfragen mit einem /?p=irgendwas.

    Kann mir jemand auf die schnelle den rewrite befehl für die htaccess sagen

    Damit dir dann auch geholfen wird:

    RewriteEngine on
    RewriteCond %{QUERY_STRING} ^p=
    RewriteRule ^$ - [R=404,NS]

    Die Verarbeitung läuft dann wie folgt: Die RegEx der RerwriteRule ^$ steht für einen leeren lokalen filepath, wie das der Fall ist, wenn die .htaccess-Datei genau dort liegt, wo vom filepath nichts mehr übrig bleibt (/var/www/htdocs/.htaccess, filename /var/www/htdocs/, es bleibt also nach Entfernen des Verzeichnisprefixes noch "" (leer) übrig). In einem zweiten Schritt wird die Bedingung geprüft, d.h. der QUERY_STRING muss mit p= beginnen. Sollte auch das wahr sein, wird die Substitution der RewriteRule angewandt, was hier so viel heißt wie „keine Ersetzung“. Schließlich wird der Statuscode 404 (direkt) ausgeliefert, d.h. eventuelle folgende Regeln werden in diesem Durchlauf nicht mehr geprüft. Andere Statuscodes als 3xx werden erst seit Version 2.1 unterstützt. Insofern solltest du deine verwendete Apache-Version vorher untersuchen. Subrquests können auch draußen bleiben (NS-Flag).
    Natürlich wäre es auch im Falle einer Version vor 2.1 möglich auf /michgibtesnicht intern umzuschreiben, was im Ergebnis dann einen 404 produziert. Damit erzeugst du dann zwar ein wenig Processing, sofern du keine high-traffic Website betreibst (dann solltest du sowieso im Idealfall auf .htaccess-Dateien verzichten), sollte sich das nicht groß bemerkbar machen.