Tôi đã có câu hỏi với vấn đề này nhưng câu hỏi khác thuộc về $_GET
và chức năng tiêu đề:
Tôi có trang web đa ngôn ngữ. Khi gọi một trang không tồn tại, .htaccess
sẽ tham chiếu đến 404.php
trong thư mục gốc.
Các .htaccess
trông như thế này:
ErrorDocument 404 /404.php
Đó 404.php
theo hướng gốc chỉ đơn giản là nhìn vào mà ngôn ngữ mặc định được thiết lập bởi một SESSION
hoặc COOKIE
và đề cập đến các thư mục con ngôn ngữ /language/404.php
Gốc 404.php
trông giống như vậy:
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");
giới thiệu đến các thư mục con ngôn ngữ, gửi URL
trông như thế này nơi tham số uri
vẫn còn khác nhau:
http://www.example.com/english/404.php?uri=somedata
hoặc với một ngôn ngữ khác:
http://www.example.com/german/404.php?uri=somedata
Mã của /english/404.php
trông như thế này:
<?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";
?>
Mẫu chỉ là một số kiểu dáng HTML. Footer sẽ được bao gồm trong template_404.php
là điểm thu hút chính để gửi dữ liệu. Trong Footer đó có tùy chọn để thay đổi cài đặt ngôn ngữ và chuyển đổi giữa các đường dẫn ngôn ngữ. Nếu một biểu mẫu sẽ được gửi, SESSION
và COOKIE
sẽ được thay đổi và trang bắt đầu chức năng tiêu đề.
Vì vậy, đây là Bộ luật từ Footer:
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>
Vấn đề là khi một trang có URL
của
http://www.example.com/**english**/404.php?uri=somedata
và tôi sẽ nộp $_POST
để thay đổi ngôn ngữ sang tiếng Đức như :
http://www.example.com/**german**/404.php?uri=somedata
ví dụ $_GET['uri']
sẽ trống và URL
trông giống như:
http://www.example.com/**german**/404.php?uri=
sau khi bắt đầu chức năng tiêu đề. Thay vì tiêu đề tôi đã cố gắng để echo ra dòng đó và tôi sẽ nhận được một thông báo rằng uri
không được xác định.
Undefined variable: uri in /customers/7/4/1/example.com/httpd.www/scripts/footer_en.php on line 102
Location: ../english/404.php?uri=
Các kỳ lạ về điều đó là khi tôi sẽ gọi trang trước khi gửi $_POST
và có một cái nhìn vào mã nguồn của trang web biến $uri
sẽ đọc ra các tham số $_GET
một cách chính xác nhưng sau này nó không hoạt động nữa trong chức năng tiêu đề. Câu hỏi đặt ra là tại sao nó không hoạt động?
Vì vậy, sẽ thật tuyệt nếu ai đó có thể cho tôi biết phải làm gì để tìm sự cố này. Tôi thực sự sẽ đánh giá cao.
Cảm ơn rất nhiều.
UPDATE:
tôi đã cố gắng để lưu các tham số $_GET
thành một SESSION
nhưng khi đăng hình thức và bị chuyển hướng đến các trang web ngôn ngữ khác nội dung của SESSION
có vẻ là sai bởi vì nó sẽ không phải là $_GET
tham số thay vì rằng nó sẽ là một cái gì đó những gì xuất phát từ một liên kết css từ đầu html như css/colorbox.css
Tại thời điểm này tôi cố gắng lấy này bằng cách thiết lập form action
đó:
...
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 sẽ biến mất vì sau khi gửi trang sẽ làm mới và không có tham số GET nào được cung cấp. Bạn có thể lưu nó trong một biến phiên? – Matheno
Khá trung thực: TL; DR. Nhưng điều hiển nhiên đối với tôi là bạn cần phải mã hóa URL các giá trị một cách chính xác trước khi gắn lại nó như một tham số truy vấn. Giá trị trong '$ _GET' được tự động URL * giải mã *. Xem http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding – deceze
@Marijke khi tôi sẽ làm điều đó bằng SESSION nội dung của nó là hoàn toàn khác với nó phải được. vì lý do nào đó, phiên này sẽ giống như css/colorbox.css ... đây là điều mà tôi không hiểu. – bonny