Thorsten: HTTP_ACCEPT_LANGUAGE - Weiterleitung auf engl. Seite mit Fehler

Hallo zusammen!

Ich habe einen gewöhnlichen HTML-Auftritt in deutscher Sprache. Nun soll diesem Auftritt ein englischer hinzugefügt werden. Daher ist mein Plan die deutsche Startseite quasi weiterhin standard-mäßig aufzurufen, auf dieser aber über HTTP_ACCEPT_LANGUAGE die Sprache abzufrage und ggf. auf die engl. Startseite umzuleiten.

Ich habe also dieses Script auf die dt. Startseite geschrieben und als index.php wieder hochgeladen:

  
<?php  
    $sprache = $_SERVER["HTTP_ACCEPT_LANGUAGE"];  
    switch($sprache) {  
  
   case 'en': $weiterleitung = 'index_en.html';break;  
   default: $weiterleitung = 'index.php';  
    }  
    header ("location: $weiterleitung");  
?>

Leider erscheint beim Aufruf der index.php folgende Fehlermeldung:
--
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/server/verzeichnis/index.php:5) in /www/htdocs/server/verzeichnis/index.php  on line 32
--

Line32 ist in diesem Fall diese Zeile:

header ("location: $weiterleitung");

Kann mir jemand weiterhelen was ich falsch mache?

Danke für Eure Mühe und viele Grüße

Thorsten

  1. Leider erscheint beim Aufruf der index.php folgende Fehlermeldung:

    Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/server/verzeichnis/index.php:5) in /www/htdocs/server/verzeichnis/index.php  on line 32

    Guckst du.

    Kann mir jemand weiterhelen was ich falsch mache?

    Nebst oben genanntem Warning? Du gehst davon aus, dass HTTP_ACCEPT_LANGUAGE ein zweistelliges ISO-639-Sprachkürzel beinhaltet.

    Ggf. vergisst du auch einfach deinen Ansatz und setzt dich mit Type Maps auseinander, sofern du Apache verwendest - warum das Rad neu erfinden?

    1. Ggf. vergisst du auch einfach deinen Ansatz und setzt dich mit Type Maps auseinander, sofern du Apache verwendest - warum das Rad neu erfinden?

      Hallo!

      Genau das habe ich gestern noch versucht. Anhand von "Content Negotiation" mit MultiViews. Ich hatte also:

      * index.html.en (enthält die Version in Englisch)
          * index.html.de (enthält die Version in Deutsch)
          * index.html.html (enthält die Version in Englisch als Standardsprache)

      Und per htaccess habe ich Multiviews aktiviert:

      Options +MultiViews

      Das hat bei mir auf dem Testserver (All-Inkl.com) auch funktioniert.
      Nur leider hat es dann auf dem Produktiv-Server (Linux/Apache) einen 500er Server Error ergeben. Dieser war wieder "weg" wenn ich die htaccess wieder gelöscht habe. Nun könnte es noch sein dass ich das Modul über die httpd.conf Zeile noch laden muss? So zumindest steht es hier:
      http://mathiasbynens.be/notes/apache-allowoverride-all

      Keine Ahnung. Ich bin jetzt zwei Tage am Probieren und wirklich funktioniern tut nix.

      Danke und Grüße

      Thorsten

      1. Hi,

        Und per htaccess habe ich Multiviews aktiviert:

        Options +MultiViews

        Das hat bei mir auf dem Testserver (All-Inkl.com) auch funktioniert.
        Nur leider hat es dann auf dem Produktiv-Server (Linux/Apache) einen 500er Server Error ergeben. Dieser war wieder "weg" wenn ich die htaccess wieder gelöscht habe.

        Dann hast du wohl nicht die Rechte, MultiViews zu setzen, Stichwort AllowOverRide.

        Keine Ahnung. Ich bin jetzt zwei Tage am Probieren und wirklich funktioniern tut nix.

        Deshalb sollte man sich *informieren*, statt nur herum zu probieren ...

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hallo,

    Ich habe also dieses Script auf die dt. Startseite geschrieben und als index.php wieder hochgeladen:

    <?php                                                       #25
        $sprache = $_SERVER["HTTP_ACCEPT_LANGUAGE"];            #26
        switch($sprache) {                                      #27
                                                                #28
       case 'en': $weiterleitung = 'index_en.html';break;       #29
       default: $weiterleitung = 'index.php';                   #30
        }                                                       #31
        header ("location: $weiterleitung");                    #32
    ?>

      
    
    > Leider erscheint beim Aufruf der index.php folgende Fehlermeldung:  
    > --  
    > Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/server/verzeichnis/index.php:5) in /www/htdocs/server/verzeichnis/index.php  on line 32  
      
    
    > Line32 ist in diesem Fall diese Zeile:  
    > `header ("location: $weiterleitung");`{:.language-php}  
      
    24 Leerzeilen sind 24 Leerzeilen zuviel. Keine Chance mehr, irgendwelche Header zu setzen. Wenn's nicht der Originalcode ist, dann hast Du einen vergleichbaren Fehler gemacht. Tröste Dich. Wie suit Dir [eindrucksvoll demonstriert hat](https://forum.selfhtml.org/?t=196867&m=1319498), hast Du viele Vorgänger.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
  3. hi,

    header ("location: $weiterleitung");

    Mal abgesehen vom eigentlichen Problem (das betrachte ich als beantwortet):

    Warum möchtest Du eine Weiterleitung, warum ein Location-Header? Meine Empfehlung: Verzichte auf eine Umleitung per HTTP und regele die automatische Sprachauswahl über die Rewrite Engine. Dann kommen _alle_ Deine Seiten sauber mit Status: 200 UND in der gem. Accept-Lang. angeforderten Sprache (falls bei Dir verfügbar). Alles Andere ist Pfusch.

    Hotti

  4. مرحبا

      
    
    > <?php  
    >     $sprache = $_SERVER["HTTP_ACCEPT_LANGUAGE"];  
    >     switch($sprache) {  
    >   
    >    case 'en': $weiterleitung = 'index_en.html';break;  
    >    default: $weiterleitung = 'index.php';  
    >     }  
    >     header ("location: $weiterleitung");  
    > ?>
    
    

    Steht das so in deiner index.php? Selbst wenn du das header-Problem löst, wirst du hier (ungetestet) eine Endlos-Schleife produzieren, da es keine bedingung gibt, die dass weiterleiten beendet.

    Und, wie suit schon schrieb, reagiert dein Script nur auf 'en', allerdings gibt es mehr als nur 'en'.

    /* ohne Anspruch auf vollständigkeit */  
    "en" => "English",  
    "en-gb" => "English/United Kingdom",  
    "en-us" => "English/United Satates",  
    "en-au" => "English/Australian",  
    "en-ca" => "English/Canada",  
    "en-nz" => "English/New Zealand",  
    "en-ie" => "English/Ireland",  
    "en-za" => "English/South Africa",  
    "en-jm" => "English/Jamaica",  
    "en-bz" => "English/Belize",  
    "en-tt" => "English/Trinidad"  
    /* Mind. die ersten 3 können als 'en' durch gehen */  
    
    

    Was noch hinzu kommt ist, dass $_SERVER["HTTP_ACCEPT_LANGUAGE"] auch Leer sein kann, was in deinem Fall zu einer "Notice" führen wird, wenn error_reporting auf on ist.

    Ich sitz seit 3 Wochen an einem ähnlichen, allerdings etwas Komplexeren Fall (Undefinierte Anzahl Sprachen); wenn Interesse besteht, kann ich ein paar Snippets posten, die dass ganze vereinfachen.

    mfg

    1. Ich sitz seit 3 Wochen an einem ähnlichen, allerdings etwas Komplexeren Fall (Undefinierte Anzahl Sprachen); wenn Interesse besteht, kann ich ein paar Snippets posten, die dass ganze vereinfachen.

      Klar hab ich daran Interesse! Ich habe eben eine deutsche Seite ganz normal in HTML. Und diese deutsche Seite soll eben genau gleich in HTML umgesetzt werden nur Englisch. Und ich möchte halt erreichen, dass die die englisch im Browser eingestellt haben die richtige Version kriegen, die Deutschen die deutsche Version und alle anderen die Englische Version.

      Wie ich vorhin schon schrieb, hab ich das mit zwischenzeitlich auch schon mit "Content Negotiation" mit MultiViews versucht. Aber der Produktiv-Server läuft immer in einen 500er Error sobald ich die dazugehörige htacess hochlade. Also falls Du eine Idee hast sehr gern.
      Meine Adresse lautet: t-21@gmx.net

      Danke und Grüße

      Thorsten

      1. مرحبا

        Klar hab ich daran Interesse! Ich habe eben eine deutsche Seite ganz normal in HTML. Und diese deutsche Seite soll eben genau gleich in HTML umgesetzt werden nur Englisch.

        Da Multiviews nicht zur verfügung stehen, wird es schwer, das ganzhe mit reinem HTML zu lösen.
        Meine herangehensweise ist eine Kombi aus PHP und mod_rewrite.

        Wenn du es mit PHP lösen möchtest, dann schau dir mal diesen Artikel an.
        Zeile 6 noch mit folgendem ersetzen:

        $lang_variable = (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))  
                       ? $_SERVER['HTTP_ACCEPT_LANGUAGE']  
                       : null ;
        

        Dann kannst du in der index.php mit

        define('AcceptLang', lang_getfrombrowser (array('de, en') /* Verfügbare Sprachen */, 'en' /* Default Sprache */, null, false ));

        AcceptLang festlegen und mit dieser Konstante weiter arbeiten. Kommst du soweit mit?

        "Content Negotiation" mit MultiViews versucht.

        Bin ich eh kein Fan von ;)
        Diese Technis setzt Statische Dokumente voraus, eignet sich bei sehr kleinen Projekten, aber wenn man was Dynamisches braucht, kannst du diese Technik gleich wieder vergessen.

        mfg

        1. Wenn du es mit PHP lösen möchtest, dann schau dir mal diesen Artikel an.
          Zeile 6 noch mit folgendem ersetzen:

          $lang_variable = (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))

          ? $_SERVER['HTTP_ACCEPT_LANGUAGE']
                         : null ;

          
          >   
          > Dann kannst du in der index.php mit  
          >   
          > `define('AcceptLang', lang_getfrombrowser (array('de, en') /* Verfügbare Sprachen */, 'en' /* Default Sprache */, null, false ));`{:.language-php}  
          >   
          > AcceptLang festlegen und mit dieser Konstante weiter arbeiten. Kommst du soweit mit?  
            
          Hi Malcolm Beck´s,  
            
          erstmal danke für Deine Mühe!  
          Okay ich habe jetzt die Datei als eigene PHP Datei httpsprache.php abgespeichert und Deine Modifikation vorgenommen.  
          Oben in die index.php habe ich folgendes geschrieben:  
          ~~~php
            
          <?php  
          include_once ('./http_sprache.php');  
            
          define('AcceptLang', lang_getfrombrowser (array('de, en') /* Verfügbare Sprachen */, 'en' /* Default Sprache */,  null, false ));  
          ?>
          

          Ich frage mich nun, wie der Browser nun "weiß" welche Datei er nehmen soll? Ich habe ja verschiedene deutsche und englische Dateien. Muss ich diese Datei nicht irgendwie "kennzeichnen" dass das Scipt weiß: "aha das ist die englische Datei". Sorry, oder denke ich da zu statisch?

          Danke und viele Grüße

          Thorsten

          1. Hi,

            Ich frage mich nun, wie der Browser nun "weiß" welche Datei er nehmen soll? Ich habe ja verschiedene deutsche und englische Dateien. Muss ich diese Datei nicht irgendwie "kennzeichnen" dass das Scipt weiß: "aha das ist die englische Datei".

            Die genannte Funktionalität liefert dir nur ein Kürzel für die Sprachversion, die der Client gerne bevorzugt erhalten würde.
            Ihm diese dann auch auszuliefern, ist deine Aufgabe.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
          2. مرحبا

            Sorry, habe diesen Thread völlig vergessen ;)

            Muss ich diese Datei nicht irgendwie "kennzeichnen" dass das Scipt weiß: "aha das ist die englische Datei". Sorry, oder denke ich da zu statisch?

            Jein. Du musst dir einfach nur eine Struktur für deine Daten schaffen.

            Mit der Funktion wird ermittelt, welche Sprache jeder User bevorzugt, das wird mit der von mir verlinkten Funktion ermittelt, wenn die Sprache des Users bei dir nicht vorhanden ist, ist AcceptLang die Defaultsprache.

            Versuch mal folgendes:

            .htaccess

            Options FollowSymLinks  
            RewriteEngine on  
            RewriteBase /  
              
            RewriteCond %{REQUEST_FILENAME} !-f  
            RewriteCond %{REQUEST_FILENAME} !-d  
            RewriteCond %{HTTP:Accept-Language} (.*)$  
            RewriteRule ^([^/]*)(/?)([^/]*)(/?)([^/]*)(/?)(.*)$  index.php?user_accept_language=%1&language=$1&lang_path=$2&uri_id=$3&uri_name=$5&sons=$6-$7-$8 [L,QSA]
            

            Und in der index.php
            var_dump($_GET);

            Und anschliessend irgend was in die Adresszeile schreiben, Bspw.:

            example.org/de/ich/bin/kein/ordner
            example.org/en/12/id/irgendwas

            Funktioniert dies bei dir?

            mfg