2013-05-17 10 views
6

Mam już pytanie dotyczące tego problemu, ale kolejne pytanie należy do: $_GET i funkcja nagłówka:

Mam wielojęzyczną stronę. Podczas wywoływania strony, która nie istnieje, .htaccess odniesie się do 404.php w katalogu głównym.

.htaccess wygląda następująco:

ErrorDocument 404 /404.php 

To 404.php w kierunku korzenia po prostu patrzy na których domyślny język ustawiony jest przez SESSION lub COOKIE i odnosi się do podkatalogu języka /language/404.php

Korzeń 404.php wygląda tak:

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"); 

skieruję do podkatalogu językowego, delegowany URL wygląda następująco gdzie parametr uri jest jeszcze inna:

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

lub innym języku:

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

Kodeks /english/404.php wygląda następująco:

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

Szablon to tylko niektóre style HTML. Stopka, która będzie dołączona do template_404.php, jest główną atrakcją do przesyłania danych. W tej stopce istnieje możliwość zmiany ustawień języka i przełączania między ścieżkami językowymi. Jeśli formularz zostanie przesłany, zmienione zostaną SESSION i COOKIE, a strona uruchomi funkcję nagłówkową.

Więc tutaj jest kod w stopce:

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> 

Problemem jest to, że gdy strona ma URL z

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

i będę złożyć $_POST zmienić język na niemiecki jak :

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

na przykład $_GET['uri'] będzie pusta i URL wygląda następująco:

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

po uruchomieniu funkcji cel. Zamiast nagłówka próbowałem wywołać echo tej linii i otrzymam komunikat, że uri nie jest zdefiniowany.

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

Dziwny o to, że gdy wezwę strony przed wysłaniem $_POST i spojrzeć na kodzie źródłowym witryny zmienna $uri odczyta parametr $_GET poprawnie, ale później na nim nie działa już w funkcji nagłówka. Pytanie brzmi: dlaczego to nie działa?

Byłoby miło, gdyby ktoś mógł mi powiedzieć, co zrobić, aby pobrać ten problem. Naprawdę byłbym wdzięczny.

Wielkie dzięki.

UPDATE:

Próbowałam zapisać parametr do SESSION$_GET ale podczas wysyłania formularza i uzyskiwanie przekierowany do innej strony językowej zawartość SESSION wydaje się być błędne, ponieważ nie będzie $_GET parametr zamiast, że będzie to coś, co przychodzi z linkiem css z głowicy html jak css/colorbox.css

w tej chwili staram się sprowadzić to poprzez ustawienie form action do tego:

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

GET zniknie, ponieważ po przesłaniu strony nastąpi odświeżenie i nie zostanie podany żaden parametr GET. Możesz zapisać go w zmiennej sesji? – Matheno

+3

Szczerze mówiąc: TL; DR. Ale dla mnie oczywiste jest to, że trzeba poprawnie zakodować wartości w adresach URL przed ponownym dołączeniem ich ponownie jako parametru zapytania. Wartości w '$ _GET' są już automatycznie dekodowane * URL *. Zobacz http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding – deceze

+0

@Marijke, kiedy zrobię to przez SESJĘ, treść tego jest kompletne, inne niż powinno być. z jakiegoś powodu sesja będzie wyglądać jak css/colorbox.css ... jest to coś, czego nie rozumiem. – bonny

Odpowiedz

1

Jeśli mam zrozumienia tego poprawnie, chcesz iść z:

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

Do:

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

pomocą formularza przycisk Prześlij. Aby to zrobić, należy ustawić akcję na znaczniku, aby uwzględnić identyfikator URI z bieżącej strony, aby przejść do nowej strony 404 języka.

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

Witam i dziękuję za odpowiedź na to pytanie. Próbowałem użyć twojej metody, ale nie działało tak, jak chciałem. zaktualizowałem moje pytanie. dzięki. – bonny

+0

Być może należy opublikować adres URL powyższego kodu, aby można go było dostosować? – jwheel12

+0

ok, twój kod tworzy ten adres URL: 'http: // www.example.com/english/404.php/english/404' – bonny

0

Z dokumentacji:

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

Dodatkowo, wierzę http: // jest wymagana dla Firefox i innych przeglądarek HTTP 1.1 reklamacji.

Może warto spróbować czegoś takiego?

1

Aby rozwinąć odpowiedź jwheel12. Działanie formularza będzie działać jako ścieżka względna bez http: // w nim. Dlatego dołączam twoje działanie = "" do bieżącego adresu URL. Jeśli to możliwe, użyj absolutnej ścieżki.

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

lub alternatywnie można przekazać zmienne jako ukryty input type

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

Chciałbym użyć funkcji niestandardowej, jak ten poniżej tej pętla przez wszystkie elementy w tablicy „$ ary "i zwróć ostatni, który nie jest pusty.

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

Wreszcie można użyć preg_replace z hiperłącze jeśli po prostu chcesz, aby przełączać się między 2 języków

$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

witam i dziękuję za odpowiedź na to pytanie. Użyłem twoich podpowiedzi, by to zrobić, ale wciąż mam mały problem. kiedy opublikuję formularz, pojawi się właściwy język, ale sama stopka będzie niewłaściwa. zmiany w sesji/ciasteczku są skuteczne, więc myślę, że strona zostanie przeładowana, ale stopka nie będzie. dzięki. – bonny

0

Czy nie byłoby łatwiej utrzymać się na tej samej stronie, ale mają Zawartość zmiany? jeśli językiem jest angielski, załaduj angielski 404 informacje, dla niemieckiego obciążenia niemiecki, itp.

Po prostu myśl. Mogę sobie wyobrazić, że może to nie być praktyczne w przypadku większych witryn.