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>
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
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
@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