6

$_GETこの問題についてはすでに質問がありますが、所属とヘッダー機能についてさらに質問があります。

私は多言語サイトを持っています。存在しないページを呼び出す場合は、ルートディレクトリ内.htaccessを参照します。404.php

は次の.htaccessようになります。

ErrorDocument 404 /404.php

ルート方向では、 or404.phpによって設定されているデフォルト言語を調べて、言語サブディレクトリを参照します。SESSIONCOOKIE/language/404.php

ルート404.phpは次のようになります。

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

言語サブディレクトリを参照すると、投稿URLは次のようになり、パラメーターuriはまだ異なります。

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は、データを送信するための主なアトラクションです。そのフッターには、言語設定を変更し、言語パスを切り替えるオプションがあります。フォームが送信されるSESSIONCOOKIE、 が変更され、ページがヘッダー関数を開始します。

フッターのコードは次のとおりです。

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>

問題は、ページにURLofがある場合

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が、後でヘッダー関数で機能しなくなることです。問題は、なぜそれがうまくいかないのかということです。

ですから、誰かがこの問題を取得するために何をすべきか教えてくれたらうれしいです. 本当に感謝します。

どうもありがとう。

アップデート:

$_GETパラメータをに保存しようとしましたSESSIONが、フォームを投稿して他の言語のサイトにリダイレクトされると、の内容SESSIONが間違っているよう$_GETです. htmlの頭のようなcss/colorbox.css

現時点では、をそれに設定してこれを取得しようとし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>
4

4 に答える 4

0

同じページにとどまり、コンテンツを変更する方が簡単ではないでしょうか? 言語が英語の場合は英語の 404 情報を読み込み、ドイツ語の場合はドイツ語を読み込みます。

ちょっとした考え。大規模なサイトでは実用的ではないかもしれないと想像できます。

于 2013-05-24T12:42:42.010 に答える
0

ドキュメントから:

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

さらに、FireFox やその他の HTTP 1.1 対応ブラウザには http:// が必要だと思います。

おそらくそのようなことを試してみませんか?

于 2013-05-20T15:20:06.200 に答える