alfie: Apache Content Negotiation

Hallo!

Ich habe Testseiten zur automatischen Sprachauswahl erstellt (Apaches Multiview ist aktiviert), und zwar

index.htm.de (deutsch)
index.htm.en (english)
index.htm.htm (=index.htm.en)

Eigenartigerweise zeigt mir mein Moz1.7.1 bei folgender Spracheinstellung (1. Deutsch/Österreich [de-at], 2. Englisch [en]) zuerst die englische Seite an.
Der IE6 verhält sich wie von mir erwartet (oder besser erhofft): zuerst kommt die deutsche Seite.

zu testen unter http://langtest.maloer.org/

Könnt ihr das nachvollziehen und/oder erklären?

mfg Alfie

  1. Hallo!

    Bei 1. [de] und 2. [en] im Mozilla klappt's.

    Anscheinend erkennt der Apache die Anforderung des Moz [de-at] nicht als Klasse von [de] und liefert daher den Default [index.htm.htm] aus. Wieso aber gerade vom IE aus schon?

    mfg Alfie

    1. Hallo!

      Langsame Klärung - in Form eines Monologs (http://www.schroepl.net/cgi-bin/http_trace.pl) sei's gedankt...

      1. im IE war bei mir [de] (und nicht [de-at]) an erster Stelle, mit [de-at] verhalten sich beide Browser gleich, d.h.

      HTTP request sent to server
      headers:
      [ 31] Accept-Language: de-at,en;q=0.5
      [ 25] Host: langtest.maloer.org

      HTTP response headers received from server:
      [ 31] Vary: negotiate,accept-language
      [ 20] Content-Language: en
      [ 30] Content-Location: index.htm.en
      [ 23] Content-Type: text/html

      d.h. [de-at] wird nicht als [de] erkannt (sonst müsste der Apache ja index.htm.de ausliefern. Eine unbekannter Language-Request müsste aber index.htm.htm und nicht index.htm.en liefern?

      Oder ist plötzlich [de-at] eine Klasse von [en] ;-)

      mfg Alfie

      1. Hallo Alfie,

        serverseitig stellst Du soetwas mit den Anweisungen aus http://httpd.apache.org/docs-2.0/mod/mod_mime.html#addlanguage des zweiten Beispiels ein.

        Gruß aus Berlin!
        eddi

        1. Hallo eddi!

          Grossartig! Ich denke, genau das war's!

          mfg Alfie

          1. Hallo,

            serverseitig stellst Du soetwas mit den Anweisungen aus http://httpd.apache.org/docs-2.0/mod/mod_mime.html#addlanguage des zweiten Beispiels ein.

            Grossartig! Ich denke, genau das war's!

            Ein Problem gibt's immer noch: Die Besucher, die zum Beispiel nur de-ch eingestellt haben, landen noch immer auf der englischen Seite. Das wirst Du allerdings so nicht beheben können, da sich mehrere AddLanguage-Direktiven zur gleichen Extension gegenseitig überschreiben:

            If multiple language assignments are made for the same extension, the last one encountered is the one that is used. That is, for the case of:

            AddLanguage en .en
            AddLanguage en-gb .en
            AddLanguage en-us .en

            documents with the extension .en would be treated as being en-us.

            Wenn Du nun also ein AddLanguage de-ch .de hinten dran hängst, dann wirst Du mit Deinem östereichischen Browser wieder auf der englischen Seite landen.

            Das Problem liegt aber beim User: Jeder, der meint, eine lokalisierte Sprachversion einstellen zu müssen, sollte als erste Alternative immer seine nicht weiter lokalisierte Sprache angeben. Also niemals de-de, de-at, de-ch, de-lu etc. ohne einzelnes de.

            Viele Grüße
            Carsten

            1. Das Problem liegt aber beim User:  Jeder, der meint, eine lokalisierte Sprachversion einstellen zu müssen, sollte als erste Alternative immer seine nicht weiter lokalisierte Sprache angeben.

              Mach das mal dem User (DAU) klar!

              Das Problem liegt bei den Browserherstellern, das UI so zu gestalten, dass der Nutzer immer seine nicht weiter lokalisierte Sprache angibt.

              Viele Grüße,
              Gunnar

              --
              „Solang wir noch tanzen können
              und richtig echte Tränen flennen,
              ist noch alles offen,
              ist noch alles drin.“
              (Gundermann)
              1. Hallo Gunnar,

                Das Problem liegt aber beim User:  Jeder, der meint, eine lokalisierte Sprachversion einstellen zu müssen, sollte als erste Alternative immer seine nicht weiter lokalisierte Sprache angeben.

                Mach das mal dem User (DAU) klar!

                Das Problem liegt bei den Browserherstellern, das UI so zu gestalten, dass der Nutzer immer seine nicht weiter lokalisierte Sprache angibt.

                Es ist zwar schon Ewigkeiten her, daß ich das letzte Mal den "de-at Mozilla" von < http://mozilla.kairo.at/> installiert hatte, aber wenn ich mich recht erinnere, dann war hier zusätzlich zu de-at auch de eingestellt (man möge mich bitte korrigieren, wenn mich meine Erinnerung trügt). Und der deutsche Mozilla, denn man von < http://www.mozilla.org> bekommt, kommt auch mit de-de _und_ de daher. Wenn hier also mit voller Absicht eine Spracheinstellung rausgelöscht wird, dann _ist_ es ein User-Problem... ;-)

                Viele Grüße
                Carsten

                1. Hallo Carsten!

                  Deprimierend. Es wäre einfach zu schön gewesen, automatische alle nichtvorhandenen Klassen der entsprechenden Familie zuzuordnen (also de-at, de-ch, de-lu, de-li zu de).

                  mfg Alfie

                  1. alfie,

                    Deprimierend. Es wäre einfach zu schön gewesen, automatische alle nichtvorhandenen Klassen der entsprechenden Familie zuzuordnen (also de-at, de-ch, de-lu, de-li zu de).

                    It could well be argued that RFC2616 has made an unfortunate choice in this regard, due to its counter-intuitive behaviour. It's at least plausible that if the server had no British English variant then the best way to respond to a request for en-GB would be to return a generic English variant, and that the user should be expected to take some additional action (such as including "en;q=0" amongst their preferences) if they want to indicate rejection of a generic variant.
                    (http://ppewww.ph.gla.ac.uk/~flavell/www/lang-neg.html)

                    Und zu meinem Einwand ebenda:
                    RFC2616 puts the responsibility on the browser designer to assist the user in understanding the consequences of this rule and to help them in including the generic language in their list if this is their intention (I know of no browser which actually offers this assistance!).

                    Gunnar

                    --
                    „Solang wir noch tanzen können
                    und richtig echte Tränen flennen,
                    ist noch alles offen,
                    ist noch alles drin.“
                    (Gundermann)
                    1. Hallo Gunnar!

                      Danke für den Link, ist sehr aufschlussreich.

                      mfg Alfie

                      1. Hallo Alfie,

                        es gäbe auch noch die Möglichkeit dies mit Environment Variables zu behandeln und mit den dementsprechenden Modulen gegenzusteuern. Aber das habe ich selbst noch nicht veranstaltet. Im Gegenteil habe ich bei einem Projekt mir eine Routine in PHP geschrieben, die aus dem gesamten Accept etwas zusammenstellt und einem Status 406 entgegenwirkt (HTTP/1.1).

                        Für Deinen Fall wäre die praktische Grundlage daraus auf index.htm.htm zu verzichten und mit einem ErrorDocument 406 zu arbeiten, was solche exzentrischen Accept-Language-Werte parst.

                        Gruß aus Berlin!
                        eddi

                  2. Hallo alfie,

                    keine schöne aber mögliche Lösung wäre es, Du hältst für jede Unterversion eine eigene Seite bereit, also index.htm.de-de, index.htm.de-at etc. (wenn Du die Möglichkeit hast, dann reicht ja ein symbolischer Link auf index.htm.de). Und dazu dann die entsprechenden AddLanguage-Direktiven:

                    AddLanguage de-de .de-de
                    AddLanguage de-at .de-at
                    etc.

                    Viele Grüße
                    Carsten

                    1. Hallo Carsten!

                      keine schöne aber mögliche Lösung wäre es, Du hältst für jede Unterversion eine eigene Seite bereit, also index.htm.de-de, index.htm.de-at etc. (wenn Du die Möglichkeit hast, dann reicht ja ein symbolischer Link auf index.htm.de). Und dazu dann die entsprechenden AddLanguage-Direktiven:

                      AddLanguage de-de .de-de
                      AddLanguage de-at .de-at
                      etc.

                      Ja theoretisch, aber schon jetzt gibt's eine Verdreifachung der Seiten. Symbolische Links kann ich leider nicht setzen. Nochmal vielen Dank, ich muss halt irgendwie damit leben ;-)

                      mfg Alfie

                      1. Hallo alfie,

                        nächste Möglichkeit: Du verwendest Type-Maps.

                        < http://httpd.apache.org/docs-2.0/content-negotiation.html.en#negotiation>

                        Hier kannst Du unter "Content-language" so viele Sprachen angeben, wie Du lustig bist. Für Dich würde das also etwa so aussehen (Dateiname index.htm.var):

                        URI: index.htm

                        URI: index.htm.en
                        Content-type: text/html
                        Content-language: en, en-us, en-gb, [...]

                        URI: index.htm.de
                        Content-type: text/html
                        Content-language: de, de-de, de-at, de-ch, de-lu, de-be, de-it, de-na, [...]

                        URI: index.htm.htm
                        Content-type: text/html

                        Beachte das Fehlen von "Content-language" bei der "Standard"-Seite.

                        Viele Grüße
                        Carsten

                        1. Hallo Carsten!

                          nächste Möglichkeit: Du verwendest Type-Maps.

                          http://httpd.apache.org/docs-2.0/content-negotiation.html.en#negotiation

                          Das klingt gut! Jetzt muss ich mich einmal ein bisschen einlesen ;-)

                          mfg Alfie

                        2. Hallo Carsten!

                          nächste Möglichkeit: Du verwendest Type-Maps.

                          http://httpd.apache.org/docs-2.0/content-negotiation.html.en#negotiation

                          Was läuft hier falsch:
                          http://langtest.maloer.org/index.htm.var

                          Wenn ich meinen Browser mit der *einzigen* Sprache [de-li] konfiguriere, wird der englische Default index.htm.htm ausgeliefert, obwohl [de-li] auf [de] gemapped ist...

                          mfg Alfie

                          1. Hallo alfie,

                            Was läuft hier falsch:
                            http://langtest.maloer.org/index.htm.var

                            Wenn ich meinen Browser mit der *einzigen* Sprache [de-li] konfiguriere, wird der englische Default index.htm.htm ausgeliefert, obwohl [de-li] auf [de] gemapped ist...

                            Mir scheint, Du warst ein wenig sparsam mit dem Setzen der Zeilenumbrüche und Leerzeilen.

                            Strukturiere Deine Type-Map mal exakt so, wie sie in den Beispielen angegeben ist.

                            Viele Grüße
                            Carsten

                            1. Hallo Carsten!

                              Mir scheint, Du warst ein wenig sparsam mit dem Setzen der Zeilenumbrüche und Leerzeilen.

                              Strukturiere Deine Type-Map mal exakt so, wie sie in den Beispielen angegeben ist.

                              Das sieht nur so aus, wenn man das File über den Bbrowser aufruft.

                              im Original:
                              URI: index.htm

                              URI: index.htm.en
                              Content-type: text/html
                              Content-language: en, en-us, en-gb, en-ca, en-au, en-ie, en-nz, en-za

                              URI: index.htm.de
                              Content-type: text/html
                              Content-language: de, de-de, de-at, de-ch, de-lu, de-be, de-it, de-li

                              URI: index.htm.htm
                              Content-type: text/html

                              mfg Alfie

                              1. Hallo Alfie,

                                könnte es sein, daß Du das

                                AddHandler type-map .var

                                in einer .htaccess-Datei vergessen hast, bzw. keine Berechtigung hast, einen Handler zu setzen?

                                Viele Grüße
                                Carsten

                                1. Hallo Carsten!

                                  könnte es sein, daß Du das
                                       AddHandler type-map .var
                                  in einer .htaccess-Datei vergessen hast

                                  Richtig vermutet! Jetzt funktioniert's, vielen Dank!

                                  mfg Alfie

                                  1. Hallo!

                                    Genauer: mit der einzig vorhandenen Sprache im [de-li] im Moz wird die deutsche Variante ausgeliefert, dann kommt ein Moz-Info mit folgendem Text (kein Scherz!):

                                    "Um die Zeichen dieser Sprache richtig anzeigen zu können, müssen Sie die folgenden Komponenten installieren:
                                    Vereinfache Chinesische Textanzeige
                                    Verwenden Sie 'regionale Optionen' in der Systemsteuerung, um diese Komponenten zu installieren."

                                    mfg Alfie

                                    1. Hallo Alfie,

                                      Genauer: mit der einzig vorhandenen Sprache im [de-li] im Moz wird die deutsche Variante ausgeliefert, dann kommt ein Moz-Info mit folgendem Text (kein Scherz!):

                                      [...]

                                      Falls es Dich beruhigt: Wenn ich Deine Seite mit dieser Einstellung aufrufe, kommt diese Meldung nicht...

                                      Viele Grüße
                                      Carsten

                                      1. Hallo Carsten!

                                        Falls es Dich beruhigt: Wenn ich Deine Seite mit dieser Einstellung aufrufe, kommt diese Meldung nicht...

                                        Ja, beruhigt mich in der Tat. War im Moz nicht reproduzierbar (vielleicht in Cache-Problem), im IE6 auch alles paletti ;-)

                                        mfg Alfie

      2. Hallo,

        Eine unbekannter Language-Request müsste aber index.htm.htm und nicht index.htm.en liefern?

        Du sagst dem Apachen aber, daß Du neben der ihm unbekannten Sprache de-at auch en akzeptierst:

        [ 31] Accept-Language: de-at,en;q=0.5

        Daher wird die englische Version ausgeliefert.

        Viele Grüße
        Carsten