2013-05-17 39 views
6

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, SESSIONCOOKIE 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 đó:

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

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

+3

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

+0

@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

Trả lời

1

Nếu tôi hiểu điều này một cách chính xác, bạn muốn đi từ:

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

Để:

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

Sử dụng một hình thức nút gửi. Để thực hiện điều này, bạn sẽ đặt hành động trên thẻ để bao gồm uri từ trang hiện tại để nó được chuyển đến trang 404 ngôn ngữ mới.

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

xin chào và cảm ơn bạn đã trả lời câu hỏi này. tôi đã thử sử dụng phương pháp của bạn, nhưng nó không hoạt động như tôi mong muốn. tôi đã cập nhật câu hỏi của mình. cảm ơn. – bonny

+0

Có lẽ đăng url mà mã ở trên được tạo để tôi có thể điều chỉnh nó? – jwheel12

+0

được, mã của bạn tạo url đó: 'http: // www.example.com/english/404.php/english/404' – bonny

0

Từ các tài liệu:

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

Bên cạnh đó, tôi tin rằng http: // là cần thiết cho FireFox và các trình duyệt khác khiếu nại HTTP 1.1.

Có thể thử một cái gì đó như thế?

1

Để mở rộng câu trả lời của jwheel12. Hành động biểu mẫu sẽ hoạt động như một đường dẫn tương đối không có http: // trong đó. Do đó, thêm hành động của bạn = "" vào URL hiện tại. Sử dụng đường dẫn tuyệt đối nếu có thể.

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

hoặc cách khác bạn có thể vượt qua các biến như một loại đầu vào ẩn

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

Tôi thích sử dụng một chức năng tùy chỉnh như hình dưới đây mà sẽ lặp qua tất cả các mục trong mảng "$ ary "và trả lại cái cuối cùng không trống.

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

Cuối cùng, bạn có thể sử dụng preg_replace với một liên kết siêu nếu bạn chỉ muốn chuyển đổi giữa 2 ngôn ngữ

$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

Xin chào và cảm ơn bạn đã trả lời câu hỏi này. tôi đã sử dụng các gợi ý của bạn để tìm nạp điều này nhưng vẫn có một vấn đề nhỏ. khi tôi sẽ đăng các hình thức ngôn ngữ bên phải sẽ được hiển thị nhưng chân chính nó sẽ là một sai lầm. những thay đổi trên phiên/cookie có hiệu lực vì vậy tôi đoán trang web sẽ được tải lại nhưng chân trang sẽ không. cảm ơn. – bonny

0

Nó sẽ không được dễ dàng hơn để ở trên cùng một trang, nhưng có sự thay đổi nội dung? nếu ngôn ngữ là tiếng Anh, tải thông tin tiếng anh 404, để tải tiếng Đức, v.v.

Chỉ cần suy nghĩ. Tôi có thể tưởng tượng rằng nó có thể không thực tế cho các trang web lớn hơn.

Các vấn đề liên quan