У меня есть многомерный языковой сайт. При вызове страницы, которая не существует, .htaccess
будет ссылаться на 404.php
в корневом направлении.
.htaccess
выглядит следующим образом:
ErrorDocument 404 /404.php
Это 404.php
в направлении корня просто выглядит, который по умолчанию язык устанавливается в SESSION
или COOKIE
и относится к языку subdirection /language/404.php
Корень 404.php
выглядит например:
include_once "scripts/pref_language.php";
if (isset ($_GET['uri']) === true){
$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 к языку subdirection, посланной URL
выглядит следующим образом:
http://www.example.com/english/404.php?uri=somedata
или другой язык:
http://www.example.com/german/404.php?uri=somedata
Код /english/404.php
выглядит так:
<?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";
?>
шаблон всего лишь HTML
стиль. Нижний колонтитул, который будет включен в template_404.php
, является главной достопримечательностью для отправки данных. В этом нижнем колонтитуле есть возможность изменить настройку языка и переключение между языковыми путями. Если будет отправлен form
, то SESSION
и COOKIE
будут изменены, и страница начнет функцию заголовка.
Так вот код из сноски:
if (isset($_GET['uri'])) {
$uri = urlencode($_GET['uri']);
echo "TEST URI: $uri";
}
$en_dir = '../en/';
$de_dir = '../de/';
$fr_dir = '../fr/';
$pl_dir = '../pl/';
$tr_dir = '../tr/';
...
$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']) === true) {
$content = $_POST['pref_lang'];
if ($content === "de") {
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="de" name="pref_lang" value="de"/><label for="de">german</label>
</form>
</li>
<li>
<form action="<?php echo $form_action;?>" method="post">
<input type="submit" id="fr" name="pref_lang" value="fr"/><label for="fr">french</label>
</form>
</li>
<li>
<form action="<?php echo $form_action;?>" method="post">
<input type="submit" id="pl" name="pref_lang" value="pl"/><label for="pl">polish</label>
</form>
</li>
<li>
<form action="<?php echo $form_action;?>" method="post">
<input type="submit" id="tr" name="pref_lang" value="tr"/><label for="tr">turkish</label>
</form>
</li>
</ul>
</fieldset>
</div>
Проблема заключается в том, что, когда страница имеет URL
из
http://www.example.com/**english**/404.php?uri=somedata
и я представлю $_POST
изменить язык на немецкий как :
http://www.example.com/**german**/404.php?uri=somedata
например $_GET['uri']
будет пустым, а URL-адрес будет выглядеть следующим образом:
http://www.example.com/**german**/404.php?uri=
после запуска функция заголовка. Вместо заголовка я попытался отобразить эту строку, и я получу сообщение, что uri
не определен.
Undefined variable: uri in /customers/7/4/1/example.com/httpd.www/scripts/footer_en.php on line 102
Location: ../english/404.php?uri=
Странная о том, что когда я буду называть страницы перед отправкой $_POST
и посмотреть на исходный код сайта переменная $uri
будет считана параметр $_GET
правильно, но позже она не работает больше в функции заголовка?
Так что было бы хорошо, если кто-нибудь скажет мне, что делать, чтобы получить эту проблему. Я действительно был бы признателен.
Спасибо большое.
Почему произвольно останавливается на двух уровнях логического сравнения? Почему бы не 'if (((isset ($ _ GET ['uri']) === true) === true) === true)'? – deceze
Извините, я не понял. можете ли вы объяснить немного дальше? – bonny
Вам не нужно сравнивать возвращаемое значение 'isset' строго с логическим значением, которое создаст другое логическое значение, которое' if' затем оценивает. 'isset' уже возвращает логическое значение, просто' if (isset (...)) 'отлично. Просто стиль кодирования nitpick. – deceze