2013-05-17 12 views
6

Ich habe bereits eine Frage mit diesem Problem, aber eine weitere Frage gehören $_GET und Header-Funktion:

Ich habe eine mehrsprachige Website. Wenn eine Seite aufgerufen wird, die nicht existiert, verweist .htaccess auf 404.php im Stammverzeichnis.

Die .htaccess sieht wie folgt aus:

ErrorDocument 404 /404.php 

Die 404.php in der Wurzel Richtung sieht einfach, an der Standardsprache durch eine SESSION oder COOKIE eingestellt ist, und bezieht sich auf das Sprachunterverzeichnis /language/404.php

Die Wurzel 404.php sieht so aus:

include_once "scripts/pref_language.php"; 

if (isset ($_GET['uri'])){ 
    $get = $_GET['uri']; 

    header("Location: /$pref_language/404.php?uri=$get"); 
    exit; 
} 

$url = urlencode($_SERVER['REQUEST_URI']); 

header("Location: /$pref_language/404.php?uri=$url"); 

Refered in die Sprache Unterverzeichnis suchen die posted URL wie diesen, wo der Parameter uri noch anders:

http://www.example.com/english/404.php?uri=somedata 

oder mit einer anderen Sprache:

http://www.example.com/german/404.php?uri=somedata 

Der Code von /english/404.php wie folgt aussieht:

<?php 
error_reporting(E_ALL); 
ob_start(); 
session_start(); 
header ("Content-Type: text/html; charset=utf-8"); 

include_once "../scripts/db_connect.php"; 
include_once "../scripts/functions.php"; 
include_once "../scripts/browser_identification.php"; 
include_once "../scripts/pref_language.php"; 

...some text variables in its specific language 

include_once "../templates/template_404.php"; 
?> 

Die Vorlage ist nur ein wenig HTML-Styling. Die Fußzeile, die in der template_404.php enthalten ist, ist die Hauptattraktion zum Senden von Daten. In dieser Fußzeile gibt es die Möglichkeit, die Spracheinstellung zu ändern und zwischen den Sprachpfaden zu wechseln. Wenn ein Formular gesendet wird, werden die SESSION und COOKIE geändert und die Seite startet eine Header-Funktion.

So, hier ist der Code aus der Fußzeile:

if (isset($_GET['uri'])) { 
    $uri = urlencode($_GET['uri']); 
    echo "TEST URI: $uri"; 
} 

... 

$basename = basename($_SERVER['SCRIPT_NAME'], ".php"); 

if ($basename === "index") { 
    $form_action = rtrim($_SERVER['PHP_SELF'], 'index.php'); 
} else{ 
    $form_action = htmlentities($_SERVER['PHP_SELF']); 
} 

... 

if (isset($_POST['pref_lang'])) { 

    $content = $_POST['pref_lang']; 

    if ($content === "german") { 

     if ($basename === "about") { 
      $basename = "info"; 
     } else if ($basename === "contact") { 
      $basename = "kontakt"; 
     }   
    } 
    $_SESSION['pref_language'] = $_POST['pref_lang']; 

    setcookie('pref_language', '', time()- 999999, '/', '.example.de'); 
    setcookie('pref_language', $content, time()+60*60*24*365, '/', '.example.de'); 

    if ($basename === "404"){ 

     header("Location: ../$content/404.php?uri=$uri"); 

    } else { 

     header("Location: ../$content/$basename"); 
    } 
} 
?> 
<div id="data"> 
    <fieldset> 
     <ul> 
      <li> 
       <form action="<?php echo $form_action;?>" method="post">  
        <input type="submit" id="german" name="pref_lang" value="german"/><label for="german">german</label> 
       </form> 
      </li> 
     </ul> 
    </fieldset> 
</div> 

Das Problem ist, dass, wenn eine Seite die URL von

http://www.example.com/**english**/404.php?uri=somedata 

hat und ich $_POST vorlegen wird die Sprache in Deutsch zu ändern wie :

http://www.example.com/**german**/404.php?uri=somedata 

zum Beispiel $_GET['uri'] ist leer, und die URL wie folgt aussieht:

http://www.example.com/**german**/404.php?uri= 

nach Header-Funktion zu starten. Anstelle von Header habe ich versucht, diese Zeile auszuhacken und ich werde eine Nachricht erhalten, dass uri nicht definiert ist.

Undefined variable: uri in /customers/7/4/1/example.com/httpd.www/scripts/footer_en.php on line 102 
Location: ../english/404.php?uri= 

Das seltsame daran ist, dass, wenn ich die Seite aufrufen, bevor $_POST und haben einen Blick auf den Quellcode der Website die Variable $uri ausgelesen wird den $_GET Parameter korrekt, aber später auf sie zu senden funktioniert nicht mehr in der Header-Funktion. Die Frage ist, warum funktioniert das nicht?

So wäre es schön, wenn mir jemand sagen könnte, was zu tun ist, um dieses Problem zu erreichen. Ich würde es wirklich schätzen.

Vielen Dank.

UPDATE:

Ich versuchte, die $_GET Parameter in ein SESSION zu speichern, aber wenn die Form der Veröffentlichung und der Inhalt der SESSION auf die anderen Sprache Website umgeleitet zu werden scheint falsch zu sein, weil es das nicht sein wird, $_GET Parameter statt, dass es etwas sein, was aus dem hTML-Kopf aus einem CSS-Link kommt wie css/colorbox.css

im Moment versuche ich, dies zu holen, indem die form action zu, dass Einstellung:

... 
if ($basename === "index") { 
    $form_action = rtrim($_SERVER['PHP_SELF'], 'index.php'); 
} 

if ($basename === "404") { 
    $form_action = ""; 
} 

if ($basename !== "index" AND $basename !== "404") { 
    $form_action = htmlentities($_SERVER['PHP_SELF']); 
} 
... 

<li> 
    <form action="<?php echo $form_action. ((isset($_GET['uri'])) ? "/english/?uri=".urlencode($_GET['uri']) : "");?>" method="post"> 
     <input type="submit" id="english" name="pref_lang" value="en"/><label for="en">englisch</label> 
    </form> 
</li> 
+0

Das GET wird verschwinden, weil nach dem Senden die Seite aktualisiert wird und kein GET-Parameter angegeben wird. Sie könnten es in einer Sitzungsvariablen speichern? – Matheno

+3

Um ganz ehrlich zu sein: TL; DR. Aber was mir ziemlich offensichtlich ist, ist, dass Sie die Werte korrekt URL-encodieren müssen, bevor Sie sie erneut als Abfrageparameter hinzufügen. Werte in '$ _GET' sind automatisch URL * decodiert *. Siehe http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding – deceze

+0

@Marijke wenn ich es durch SESSION tun werde der Inhalt davon ist a Vollständigkeit anders als es sein sollte. Aus irgendeinem Grund wird die Sitzung etwas wie css/colorbox.css sein ... das ist etwas was ich nicht verstehe. – bonny

Antwort

1

Wenn ich das richtig zu verstehen, wollen Sie gehen:

http://www.example.com/**english**/404.php?uri=somedata 

An:

http://www.example.com/**german**/404.php?uri=somedata 

Mit einem Formular Absenden-Button. Um dies zu tun, würden Sie die Aktion für das Tag festlegen, um das URI von der aktuellen Seite einzufügen, sodass es an die neue Sprache 404-Seite übergeben wird.

<form action="<?php echo $form_action . ((isset($_GET['uri']))?$_GET['uri']:""); ?>" method="post"> 
+0

hallo und danke für die Beantwortung dieser Frage. Ich habe versucht, mit Ihrer Methode, aber es hat nicht funktioniert, wie ich es erwartet habe. Ich habe meine Frage aktualisiert. Vielen Dank. – bonny

+0

Vielleicht posten Sie die URL, die der obige Code erstellt, so dass ich es anpassen kann? – jwheel12

+0

OK, Ihr Code erstellt diese URL: 'http: // www.example.com/deutsch/404.php/english/404' – bonny

0

Aus der Dokumentation:

Note: 

HTTP/1.1 requires an absolute URI as argument to » Location: including the scheme, hostname and absolute path, but some clients accept relative URIs. You can usually use $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] and dirname() to make an absolute URI from a relative one yourself: 

<?php 
/* Redirect to a different page in the current directory that was requested */ 
$host = $_SERVER['HTTP_HOST']; 
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); 
$extra = 'mypage.php'; 
header("Location: http://$host$uri/$extra"); 
exit; 
?> 

Außerdem glaube ich http: // für FireFox und andere HTTP 1.1 Beschwerde Browser erforderlich ist.

Vielleicht versuchen Sie so etwas?

1

Um auf jwheel12 Antwort zu erweitern. Die Formularaktion funktioniert als relativer Pfad ohne http: // darin. Hängen Sie daher Ihre Aktion = "" an die aktuelle URL an. Verwenden Sie nach Möglichkeit einen absoluten Pfad.

<form action="http://www.example.com/english/404.php<?php echo ($_SERVER['QUERY_STRING'])? 
"?".$_SERVER['QUERY_STRING']) : "");?>" method="post"> 

oder alternativ die Variablen als versteckte Eingabetyp passieren könnte

foreach ($_GET as $key => $value) { 
echo '<input type="hidden" name="'.$key.'" value"'.$value.'">'; 
} 

Ich mag unterhalb dieser Schleife wird durch alle Elemente im Array „$ ary eine benutzerdefinierte Funktion wie das verwenden, "und gib den letzten zurück, der nicht leer ist.

$myVariable = getVar('myVariable'); 

function getVar($var) { 
$ary = array('_SESSION', '_COOKIE', '_POST', '_GET'); 
foreach ($ary as $a) { 
    if ($GLOBALS[$a][$var] != '') { 
     $return = $GLOBALS[$a][$var]; 
    }; 
}; 
return $return; 
}; 

Schließlich könnten Sie preg_replace mit einem Hyper-Link verwenden, wenn Sie nur zwischen zwei Sprachen umschalten wollen

$currentURL = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
if (preg_match('/german/i', $currentURL)){ 
$newURL = preg_replace('/german/i', 'english',$currentURL); 
$currentLanguage = "german"; 
} 
else { 
$newURL = preg_replace('/english/i', 'german',$currentURL); 
$currentLanguage = "english"; 
}; 
echo '<a href ="'.$newURL. '">'($currentLanguage == "german"? "View in English": "Sehen Sie auf Deutsch";). '</a>'; 
+0

Hallo und vielen Dank für die Beantwortung dieser Frage. Ich habe Ihre Hinweise verwendet, um dies zu erreichen, aber immer noch ein kleines Problem. Wenn ich das Formular posten werde, wird die richtige Sprache angezeigt, aber die Fußzeile selbst wird die falsche sein. Die Änderungen bei Session/Cookie werden wirksam, also denke ich, dass die Seite neu geladen wird, aber die Fußzeile nicht. Vielen Dank. – bonny

0

Wäre es nicht einfacher sein, auf der gleichen Seite zu bleiben, haben aber den Inhalt ändern? Wenn die Sprache Englisch ist, laden Sie die Englisch 404 Info, für Deutsch laden Sie die Deutsch, etc.

Nur ein Gedanke. Ich kann mir vorstellen, dass es für größere Sites nicht praktikabel ist.