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