Tario: Apache - Redirect, Mehrsprachigkeit

Hallo,

ich habe im DOCUMENT_ROOT meiner Webpräsenz eine htaccess-Datei erstellt, welche dafür sorgt, dass meine Seite stets ohne dem Präfix www aufgerufen wird:

RewriteCond %{HTTP_HOST} www\.example\.org$ [NC]  
RewriteRule ^(.*)$ http://example.org/$1 [R=301,L]

Im zweiten Schritt prüfe ich dann in einer Basisklasse, ob in der URL eine Sprach-Angabe existiert. In meinem Falle so was wie http://example.org/en.
Existiert keine solch eine Angabe, dann sende ich einen Redirect auf die entsprechende Sprache (abhängig vom Browser).

header( 'Location: '.$newUrl, true, 301 );

Hierbei kann es folglich zu zwei Redirects hintereinander kommen.

Nun meine Fragen:

  • Kann man das so machen?
  • Hat das irgendwelche negativen Auswirkungen in Bezug auf Suchmaschinen?
  • Und ist der 301-Code dafür der Richtige?

Vielen Dank
Tario

  1. Hallo,

    eine Frage habe ich dabei noch vergessen. Es geht um das Verhalten, wenn eine Seite - außer der Startseite - aufgerufen wird, welche keine Sprachangabe besitzt. Also so was wie:
    http://example.org/sub1/sub2/dummy.html

    Was wäre an dieser Stelle das korrekte Verhalten? Das gleiche wie im Falle der Startseite? Sprich, die URL verarbeiten und ein entsprechendes Sprachkürzel davorhängen?
    http://example.org/de/sub1/sub2/dummy.html

    Oder einen 404er zu schmeissen?

    Recht herzlichen Dank,
    Tario

    1. Hi,

      Es geht um das Verhalten, wenn eine Seite - außer der Startseite - aufgerufen wird, welche keine Sprachangabe besitzt. [...]
      Was wäre an dieser Stelle das korrekte Verhalten?

      Das kann man nicht pauschal beantworten.

      Das gleiche wie im Falle der Startseite? Sprich, die URL verarbeiten und ein entsprechendes Sprachkürzel davorhängen? [...]
      Oder einen 404er zu schmeissen?

      Jetzt denk' erst mal einen Moment lang weniger an die ach so heiligen Suchmaschinen, und erst mal an die Besucher deiner Seite - was ist für die wohl sinnvoller?

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      1. Hi ChrisB,

        Oder einen 404er zu schmeissen?
        Jetzt denk' erst mal einen Moment lang weniger an die ach so heiligen Suchmaschinen, und erst mal an die Besucher deiner Seite - was ist für die wohl sinnvoller?

        Das stimmt natürlich. So rum wird ein Schuh draus ;-)

        Aber ich muss doch noch einmal nach haken: Ein 301er ist an dieser Stelle dann auf jeden Fall OK?

        MfG
        Tario

        1. Moin!

          Aber ich muss doch noch einmal nach haken: Ein 301er ist an dieser Stelle dann auf jeden Fall OK?

          Bei einem 301er forderst Du den Browser auf, die neue URL neu anzufordern, dann beginnt das ganze Spiel (mit der neuen URL) von vorn. Das kann sinnvoll sein, muss es nicht.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

  2. hi,

    header( 'Location: '.$newUrl, true, 301 );

    Hierbei kann es folglich zu zwei Redirects hintereinander kommen.

    Das sind genau zwei zuviel. Wenn Du schon die Rewrite-Engine einsetzt, warum dann ein Redirect mit 30x für die jeweilig requestete Sprache (HTTP_ACCEPT_LANGUAGE)? Mit der RE kannst Du das ganz fein lösen, _ohne_ Redirect.

    Hotti

    1. Hallo Hotti,

      Das sind genau zwei zuviel. Wenn Du schon die Rewrite-Engine einsetzt, warum dann ein Redirect mit 30x für die jeweilig requestete Sprache (HTTP_ACCEPT_LANGUAGE)? Mit der RE kannst Du das ganz fein lösen, _ohne_ Redirect.

      Das verstehe ich jetzt nicht.

      Die erste RewriteRule in der htaccess führt doch bereits das erste Redirect aus (von www.example.org auf example.org)? Oder ist das gar kein richtiges Redirect?

      Zweitens: Wenn ich mit HTTP_ACCEPT_LANGUAGE arbeite, dann besteht für den Benutzer ja nicht mehr die Möglichkeit die Sprache über die GUI zu ändern. Und hierfür gibt es afaik nur Cookie-Lösungen, welche für mich nicht in Frage kämen.
      Oder meintest du, dass die HTTP_ACCEPT_LANGUAGE nur dann ausgelesen wird, wenn gar keine Sprache angegeben ist?

      Danke
      Tario

      Hotti

      1. Moin!

        Zweitens: Wenn ich mit HTTP_ACCEPT_LANGUAGE arbeite, dann besteht für den Benutzer ja nicht mehr die Möglichkeit die Sprache über die GUI zu ändern.

        Wieso?

        Und hierfür gibt es afaik nur Cookie-Lösungen, welche für mich nicht in Frage kämen.

        Ich glaube das jeder, der sämtliche Cookies ablehnt, schon bald
        feststellt, dass das Web für ihn praktisch unbenutzbar ist. Session-Cookies werden die
        meisten wohl akzeptieren.

        Aber wieso?

        Aber die Lösung mit Cookies braucht es nicht. Baue Deine .htaccess so, dass der Server erst nach mal nach der URI schaut und erst dann, wenn er dort nichts findet, HTTP_ACCEPT_LANGUAGE abfragt. Man kann Regeln so bauen, dass diese jeweils die letzten sind, die abgearbeitet werden und nicht jede erzeugt ein neues Request.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Hallo fastix,

          danke für deine Antwort.

          Zweitens: Wenn ich mit HTTP_ACCEPT_LANGUAGE arbeite, dann besteht für den Benutzer ja nicht mehr die Möglichkeit die Sprache über die GUI zu ändern.
          Wieso?

          Siehe mein anderes Posting. Hier hatte ich einen Denkfehler. Denn der Wert sollte ja schließlich nur dann ausgewertet werden, wenn keine Sprache angegeben ist. Somit ist meine obige Aussage Quatsch.

          Und hierfür gibt es afaik nur Cookie-Lösungen, welche für mich nicht in Frage kämen.
          Ich glaube das jeder, der sämtliche Cookies ablehnt, schon bald
          feststellt, dass das Web für ihn praktisch unbenutzbar ist. Session-Cookies werden die
          meisten wohl akzeptieren.

          Darum ging es mir nicht. Der Grund war der, dass ich mich schon jetzt recht schwer tue mit dem Apache (vor allem RegExp), so dass das die Sache noch erschweren würde.

          Aber die Lösung mit Cookies braucht es nicht. Baue Deine .htaccess so, dass der Server erst nach mal nach der URI schaut und erst dann, wenn er dort nichts findet, HTTP_ACCEPT_LANGUAGE abfragt. Man kann Regeln so bauen, dass diese jeweils die letzten sind, die abgearbeitet werden und nicht jede erzeugt ein neues Request.

          Das klingt gut!

          Das heisst, wenn (in meinem folgenden Bsp) bereits Condition 1 zutrifft, dann wird Condition 2 gar nicht mehr weiter beachtet?

          RewriteCond [nummer_1]
          RewriteRule [rule_1]

          RewriteCond [nummer_2]
          RewriteRule [rule_2]

          Vielen Dank!
          Tario

          1. Moin!

            Das heisst, wenn (in meinem folgenden Bsp) bereits Condition 1 zutrifft, dann wird Condition 2 gar nicht mehr weiter beachtet?

            RewriteCond [nummer_1]
            RewriteRule [rule_1]

            RewriteCond [nummer_2]
            RewriteRule [rule_2]

            wenn Du das [L] [rule_1] hinter nicht vergisst und in [rule_1] nicht gleich eine neue, mit http:// beginnende Adresse angibst... denn dann beginnt der komplette Request von neuem, weil der Useragent aufgefordert wird, die neue Seite anzufordern.

            RewriteRule [rule_1] [L]

            Gibst Du eine neue URL vor, dann ist das wie:

            [Wahlvorgang]
            T: "Hallo Mutti"
            M: "Wer bist Du?"
            T: "Tario"
            M: "Ich habe keine Zeit für Dich, Ruf Oma an." [L]
            [Wahlvorgang]
            T: "Hallo Oma!"
            O: "Wer bist Du?"
            T: "Tario"
            O: "Ah Tario. Schön, dass Du anrufst!" [L]

            Ohne URL:

            [Wahlvorgang]
            T: "Hallo Mutti"
            M: "Wer bist Du?"
            T: "Tario"
            M: "Ich habe keine Zeit für Dich, Ich geb Dir mal die Oma" [L] -> "Oma! Der Tario ist am Telefon!"
            O: "Ah Tario. Schön, dass Du anrufst!"

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

      2. hi,

        Das sind genau zwei zuviel. Wenn Du schon die Rewrite-Engine einsetzt, warum dann ein Redirect mit 30x für die jeweilig requestete Sprache (HTTP_ACCEPT_LANGUAGE)? Mit der RE kannst Du das ganz fein lösen, _ohne_ Redirect.

        Das verstehe ich jetzt nicht.

        Die erste RewriteRule in der htaccess führt doch bereits das erste Redirect aus (von www.example.org auf example.org)? Oder ist das gar kein richtiges Redirect?

        Entscheidend ist das Flag [R=301]. Mit dem Flag wird der Server einen Location Header senden, ansonsten nicht. Mit einem geeigneten Tool, was die HTTP Header zeigt, kannst und solltest Du das prüfen.

        Zweitens: Wenn ich mit HTTP_ACCEPT_LANGUAGE arbeite, dann besteht für den Benutzer ja nicht mehr die Möglichkeit die Sprache über die GUI zu ändern.

        Warum nicht? Das liegt doch ganz an Dir, bzw. an dem, was Du anbietest. Jeder halbwegs begabte Surfer weiß übrigens auch selbst, wie er die bevorzugte Sprache in seinem Browser einstellen kann.

        Viel Spaß ;-)

        Hotti

        1. Hi,

          Entscheidend ist das Flag [R=301]. Mit dem Flag wird der Server einen Location Header senden, ansonsten nicht.

          Erzähl doch nicht wieder so einen Blödsinn, sondern informiere dich bitte.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Hi,

            Entscheidend ist das Flag [R=301]. Mit dem Flag wird der Server einen Location Header senden, ansonsten nicht.

            Erzähl doch nicht wieder so einen Blödsinn, sondern informiere dich bitte.

            Na, das war mir doch bei meiner Antwort weiter oben eben schon klar, dass Du das Flag [R=301] nicht verstanden hast. Ist ja echt der Hammer, was Du hier ablässt, hast wohl studiert ;-)

            Hotti

            1. Hi,

              Entscheidend ist das Flag [R=301]. Mit dem Flag wird der Server einen Location Header senden, ansonsten nicht.

              Erzähl doch nicht wieder so einen Blödsinn, sondern informiere dich bitte.

              Na, das war mir doch bei meiner Antwort weiter oben eben schon klar, dass Du das Flag [R=301] nicht verstanden hast.

              Und mir war klar, dass du mal wieder genau sowas antworten würdest - weil dir traurigerweise nie selber klar ist, wenn du hier Scheiße erzählst.
              Und das, obwohl es dir bei der Frequenz, mit der du es hier machst und auch mit der, mit der du immer wieder von Mitpostern hier darauf aufmerksam gemacht wirst, eigentlich langsam selbst auffallen müsste.

              Ist ja echt der Hammer, was Du hier ablässt, hast wohl studiert ;-)

              Nee, ist der Hammer, was du hier ablässt - du hast wohl ziemlich wenig Ahnung; viel weniger, als du hier immer weiß machen willst.

              Um noch mal auf den Kritikpunkt meines vorherigen Postings zurück zu kommen (vielleicht liegt dort ja auch dein Verständnisproblem? Dann frag doch bitte normal nach.):

              Entscheidend ist das Flag [R=301]. Mit dem Flag wird der Server einen Location Header senden, ansonsten nicht.

              • diese Aussage ist definitiv *falsch*, fachlich *nicht* korrekt.

              Das Flag R mag zwar von Nöten sein, wenn eine Umleitung auf die selbe Domain stattfinden soll - aber der Codewert 301 ist es nicht. Es gibt noch andere HTTP-Statuscodes, die zusammen mit einem Location-Header auftreten.

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        2. @@hotti:

          nuqneH

          Jeder halbwegs begabte Surfer weiß übrigens auch selbst, wie er die bevorzugte Sprache in seinem Browser einstellen kann.

          Wie ChrisB sagte: Erzähl doch nicht wieder so einen Blödsinn.

          Außerdem möchte ein Nutzer vielleicht auch mal bewust eine andere Sprachversion lesen, ohne dazu seine Browsereinstellungen zu ändern.

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
    2. Hi,

      Hierbei kann es folglich zu zwei Redirects hintereinander kommen.

      Das sind genau zwei zuviel. Wenn Du schon die Rewrite-Engine einsetzt, warum dann ein Redirect mit 30x für die jeweilig requestete Sprache (HTTP_ACCEPT_LANGUAGE)? Mit der RE kannst Du das ganz fein lösen, _ohne_ Redirect.

      Nur weil etwas theoretisch möglich ist, muss es in der Praxis nicht sinnvoll sein.

      Die *Umleitung* auf die Sprachversion anhand der Accept-Language halte ich sehr wohl für angebracht - schließlich sollen alle Sprachversionen ja sowieso per eindeutigem URL erreichbar sein, also warum nicht auch den verwenden zur Auslieferung der Ressource?
      Das macht die Struktur für den Nutzer auch klarer; und es kommt nicht zu so vielen Fällen von „Warte, ich schick dir mal den Link!“, „Hä? Da ist doch alles auf $fremdsprache geschrieben?“, „Nö, also bei mir nicht ...?“

      @Tario, zu deiner zweiten Rückfrage: Natürlich, automatische Umleitung nur dann, wenn nicht schon im URL die gewünschte Sprachversion mitgegeben wurde.
      Auflistung der Gegenstücke der aktuellen Seite in anderen Sprachversionen als Links für den Nutzer ist dann natürlich geboten. (Linktexte *in* der jeweiligen Sprache, und nein, keine Flaggen als Sprachkennzeichen - siehe Archiv.)

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      1. hi,

        Hierbei kann es folglich zu zwei Redirects hintereinander kommen.

        Das sind genau zwei zuviel. Wenn Du schon die Rewrite-Engine einsetzt, warum dann ein Redirect mit 30x für die jeweilig requestete Sprache (HTTP_ACCEPT_LANGUAGE)? Mit der RE kannst Du das ganz fein lösen, _ohne_ Redirect.

        Nur weil etwas theoretisch möglich ist, muss es in der Praxis nicht sinnvoll sein.

        Nurmalso nebenbei: Es ist auch praktisch möglich ;-)

        Und Überhaupt: Hier im Forum wird stets empfohlen auf Redirects zu verzichten. Diese Empfehlung unterstütze ich auch hinsichtlich Mehrsprachigkeit, weil es mit der RE möglich ist, einen URI umzuschreiben ohne eine Redirection zu machen. Ansonsten kannst Du auf die Rewrite Engine auch verzichten, wenn Dich und Deine Besucher ein Redirect nicht stört.

        Oder Hast Du das Flag [R=301] nicht verstanden?

        Hotti

        1. Hi,

          Und Überhaupt: Hier im Forum wird stets empfohlen auf Redirects zu verzichten.

          Das dürfte stark auf den jeweiligen Kontext ankommen.

          Absolut pauschal ist an dieser Empfehlung jedenfalls nichts.

          Diese Empfehlung unterstütze ich auch hinsichtlich Mehrsprachigkeit, weil es mit der RE möglich ist, einen URI umzuschreiben ohne eine Redirection zu machen.

          Noch mal: Es geht *nicht* ums möglich, sondern ums *sinnvoll*.

          Warum ich das nicht sinnvoll finden kann, habe ich zuvor schon begründet.

          Ansonsten kannst Du auf die Rewrite Engine auch verzichten, wenn Dich und Deine Besucher ein Redirect nicht stört.

          Auch darum geht es nicht, ob die RE hier „verzichtbar“ wäre oder nicht. Sie ist ein Werkzeug, das sich zur Umsetzung der Aufgabenstellung hervorragend eignet.

          Oder Hast Du das Flag [R=301] nicht verstanden?

          Nein, du hast da was nicht verstanden. (Unterlasse es doch bitte, dich immer wieder in diese Art der Diskussionsführung zu flüchten - insb., wenn die in den meisten Fällen für dich selber nach hinten los geht.)

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. @@ChrisB:

        nuqneH

        und es kommt nicht zu so vielen Fällen von „Warte, ich schick dir mal den Link!“, „Hä? Da ist doch alles auf $fremdsprache geschrieben?“, „Nö, also bei mir nicht ...?“

        Gerade wenn man anderen einen Link mitteilt, ist es sinnvoll, dass dieser der generische, nicht der sprachspezifische ist. [icke:2008, icke:2007]

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
        1. Hi,

          Gerade wenn man anderen einen Link mitteilt, ist es sinnvoll, dass dieser der generische, nicht der sprachspezifische ist.

          Kommt immer auf den Einzelfall an. Wenn ich mich auf ein konkretes Zitat in Sprache XY beziehe, das dann aber gar nicht auf der Seite zu finden, wenn du sie dir in einer anderen Sprachversion anschaust, kann das auch verwirrend sein.

          Zumal die Qualität unterschiedlicher Sprachversionen nicht immer gleich hoch sein muss, Bsp. PHP-Manual.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. @@ChrisB:

            nuqneH

            Gerade wenn man anderen einen Link mitteilt, ist es sinnvoll, dass dieser der generische, nicht der sprachspezifische ist.

            Kommt immer auf den Einzelfall an.

            Ja, natürlich.

            Wenn ich mich auf ein konkretes Zitat in Sprache XY beziehe, das dann aber gar nicht auf der Seite zu finden, wenn du sie dir in einer anderen Sprachversion anschaust, kann das auch verwirrend sein.

            Beispiel gefällig? ;-)

            Warum es angebracht ist, Sprachvereinbarung (language negotiation) einzusetzen, erklärt dieser Artikel. (generisch)

            vs.

            Auf die Verwendung des Begriffs „Sprachvereinbarung“ geht der Übersetzer der deutschen Sprachvariante in einer Randbemerkung ein. (sprachspezifisch)

            Zumal die Qualität unterschiedlicher Sprachversionen nicht immer gleich hoch sein muss, Bsp. PHP-Manual.

            Schlag nach bei Cheatah. ;-)

            Und das ist ein guter Grund für einen Nutzer, die Sprache zu wechseln ohne die Browsereinstellungen zu ändern.

            Qapla'

            --
            Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
            (Mark Twain)
            1. Hi,

              Zumal die Qualität unterschiedlicher Sprachversionen nicht immer gleich hoch sein muss, Bsp. PHP-Manual.

              Schlag nach bei Cheatah. ;-)

              Ich will kein soziales Problem technisch lösen (dazu bin ich im Falle PHP-Manual, Apache-Manual, etc. weder befugt, noch sehe ich darin meine Aufgabe) - sondern nur, dass die Technik mir wenigstens die *Möglichkeit* gibt, die negativen Auswirkungen dieses Problems so gut wie möglich zu umschiffen.

              Und das ist ein guter Grund für einen Nutzer, die Sprache zu wechseln ohne die Browsereinstellungen zu ändern.

              Ja - es ist aber ein ebenso guter Grund dafür, mir nicht dazwischen zu funken, wenn ich bewusst die Adresse einer bestimmten Sprachversion weitergeben will.

              Wenn ich nur die generische Adresse weitergeben wollen würde, würde ich das tun.

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. Hi,

    Hierbei kann es folglich zu zwei Redirects hintereinander kommen.

    Dann mache einen daraus, in dem du die Abfrage der zwei Bedingungen und jeweilige Reaktion darauf sinnvoll miteinander verknüpfst.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi ChrisB,

      Dann mache einen daraus, in dem du die Abfrage der zwei Bedingungen und jeweilige Reaktion darauf sinnvoll miteinander verknüpfst.

      OK, danke. Ich hatte mich durch Hottis Antwort noch weiter in die Iree reiten lassen.

      Also nach meiner Auffassung implementiere ich das jetzt so:

      1. wenn www.example.org --> example.org. [R=301]

      2. wenn in URI keine Sprache --> HTTP_ACCEPT_LANGUAGE. [R=301]

      3. in PHP: wenn HTTP_ACCEPT_LANGUAGE nicht unterstuetzt wird, Fallback auf Default [R=301]

      Das heisst ausschließlich in dem Fall, dass keine Sprache angegeben ist, und die Anwendung die HTTP_ACCEPT_LANGUAGE nicht unterstützt, finden zwei Redirects statt.

      Vielen Dank für eure Hilfe!
      Ich werde mich da morgen mal dransetzen und ggfs. Rückfragen haben (so fern Ihr dann noch interessiert seid ;-)

      Grüße & Danke!
      Tario

      1. Hi,

        Also nach meiner Auffassung implementiere ich das jetzt so:

        1. wenn www.example.org --> example.org. [R=301]

        2. wenn in URI keine Sprache --> HTTP_ACCEPT_LANGUAGE. [R=301]

        3. in PHP: wenn HTTP_ACCEPT_LANGUAGE nicht unterstuetzt wird, Fallback auf Default [R=301]

        Das heisst ausschließlich in dem Fall, dass keine Sprache angegeben ist, und die Anwendung die HTTP_ACCEPT_LANGUAGE nicht unterstützt, finden zwei Redirects statt.

        Nö, 1. und 2. solltest du zusammenfassen.

        Und 3. muss auch nicht erst in PHP gemacht werden; wenn der Client Kisuaheli anfordert, du das aber nicht vorliegen hast - dann halt Umleitung auf die Defaultsprache.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?