Ho già una domanda con questo problema, ma un'ulteriore domanda appartenente $_GET
e intestazione-funzione:
Ho un sito multilingue. Quando si chiama una pagina che non esiste, .htaccess
farà riferimento a 404.php
nella directory principale.
Il .htaccess
aspetto:
ErrorDocument 404 /404.php
Tale 404.php
nella direzione principale semplicemente guarda quale lingua predefinita viene impostata da un SESSION
o COOKIE
e si riferisce alla sottodirectory linguaggio /language/404.php
La radice 404.php
assomiglia a quello:
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");
riferiti alla sottodirectory di lingua, l'inviato URL
appare come questo, dove il parametro uri
è ancora diversa:
http://www.example.com/english/404.php?uri=somedata
o con un'altra lingua:
http://www.example.com/german/404.php?uri=somedata
Il codice di /english/404.php
simile a questo:
<?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";
?>
Il modello è solo uno stile HTML. Il piè di pagina che verrà incluso nel template_404.php
è l'attrazione principale per l'invio di dati. In quel piè di pagina c'è la possibilità di cambiare l'impostazione della lingua e passare da una lingua all'altra. Se verrà inviato un modulo, SESSION
e COOKIE
verranno modificati e la pagina avvierà una funzione di intestazione.
Quindi, ecco il codice del piè di pagina:
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>
Il problema è che quando una pagina ha il URL
di
http://www.example.com/**english**/404.php?uri=somedata
e mi sottoporrò $_POST
per cambiare la lingua di tedesco come :
http://www.example.com/**german**/404.php?uri=somedata
per esempio $_GET['uri']
sarà vuoto e il URL
assomiglia:
http://www.example.com/**german**/404.php?uri=
dopo l'avvio funzione intestazione. Invece di intestazione ho cercato di echo fuori quella linea e riceverò un messaggio che uri
non è definito.
Undefined variable: uri in /customers/7/4/1/example.com/httpd.www/scripts/footer_en.php on line 102
Location: ../english/404.php?uri=
La strana di questo è che quando chiamerò pagina prima di inviare $_POST
e dare un'occhiata al codice sorgente del sito variabile $uri
leggerà il parametro $_GET
correttamente, ma in seguito non funziona più nella funzione di intestazione. La domanda è: perché non funziona in questo?
Quindi sarebbe bello se qualcuno potesse dirmi cosa fare per recuperare questo problema. Lo apprezzerei davvero.
Grazie mille.
UPDATE:
ho cercato di salvare il parametro $_GET
in un SESSION
, ma durante la pubblicazione il modulo e ottenere reindirizzato verso l'altro sito in lingua il contenuto del SESSION
sembra essere sbagliato, perché non sarà la $_GET
parametro invece di che sarà qualcosa di quello che viene da un collegamento css dalla testa html come css/colorbox.css
al momento cerco di prendere questo impostando il form action
a che:
...
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>
Il GET scomparirà perché dopo aver inviato la pagina si aggiorna e non viene fornito alcun parametro GET. Potresti salvarlo in una variabile di sessione? – Matheno
Per essere onesti: TL; DR. Ma ciò che è piuttosto ovvio per me è che devi codificare gli URL correttamente prima di aggiungerli nuovamente come parametro di query. I valori in '$ _GET' sono automaticamente URL * decodificati * già. Vedi http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding – deceze
@Marijke quando lo farò in SESSIONE il contenuto di questo è un completety diverso da dovrebbe essere. per qualche motivo la sessione sarà qualcosa come css/colorbox.css ... questo è qualcosa che non capisco. – bonny