2013-05-17 16 views
6

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:

01.235.
... 
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

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

+3

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

+0

@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

risposta

1

Se ho la comprensione correttamente, vuoi andare da:

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

A:

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

Utilizzando una forma pulsante di invio. Per fare ciò, devi impostare l'azione sul tag per includere l'uri dalla pagina corrente in modo che venga passato alla nuova pagina 404 della lingua.

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

ciao e grazie per aver risposto a questa domanda. Ho provato a usare il tuo metodo, ma non ha funzionato come avevo previsto. ho aggiornato la mia domanda. Grazie. – bonny

+0

Forse post l'url che il codice di cui sopra è stato creato in modo che io possa regolarlo? – jwheel12

+0

okay, il tuo codice crea quell'URL: 'http: // www.example.com/english/404.php/english/404' – bonny

0

Dalla documentazione:

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; 
?> 

Inoltre, credo che http: // è richiesto per Firefox e altri browser reclamo HTTP 1.1.

Forse provare qualcosa del genere?

1

Per espandere la risposta di jwheel12. L'azione modulo funzionerà come un percorso relativo senza http: // in esso. Quindi aggiungendo il tuo action = "" all'URL corrente. Utilizzare un percorso assoluto, se possibile.

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

o, in alternativa si poteva passare le variabili come un tipo di input nascosto

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

mi piace usare una funzione personalizzata come quella qui sotto quel ciclo volontà attraverso tutti gli elementi dell'array "$ ary "e restituire l'ultimo che non è vuoto.

$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; 
}; 

Infine si potrebbe usare preg_replace con un collegamento ipertestuale se si desidera solo per passare da 2 lingue

$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

ciao e grazie per aver risposto a questa domanda. Ho usato i tuoi suggerimenti per recuperare questo, ma ho ancora un piccolo problema. quando posterò il modulo verrà visualizzata la lingua corretta ma il footer stesso sarà quello sbagliato. le modifiche sulla sessione/cookie diventano effettive quindi suppongo che il sito verrà ricaricato ma il piè di pagina non lo sarà. Grazie. – bonny

0

Non sarebbe più facile rimanere sulla stessa pagina, ma hanno il cambiamento dei contenuti? se la lingua è inglese, caricare le informazioni 404 inglese, per il tedesco caricare il tedesco, ecc.

Solo un pensiero. Posso immaginare che potrebbe non essere pratico per i siti più grandi.

Problemi correlati