web-dev-qa-db-ja.com

HTTPクエリ文字列変数を使用したPHPリダイレクト

atm次の4行を使用して、ユーザーをWebサイトの別のページにリダイレクトしています。

<?php
    header("Status: 301 Moved Permanently");
    header("Location: ./content/index.html");
    exit;
?>

ただし、http://< url >?param=blahなどのHTTPクエリ文字列変数の使用には問題があります
これらは当然ながらURLに追加されません。

これを実装するためのスマートな動きはありますか?

あいさつ

35
Graslandpinguin
<?php
    header("Status: 301 Moved Permanently");
    header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
    exit;
?>
85
regality

リダイレクトを行い、クエリ文字列が渡されないときに余分な疑問符が表示されないようにするには、次を使用します

function preserve_qs() {
    if (empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], "?") === false) {
        return "";
    }
    return "?" . $_SERVER['QUERY_STRING'];
}
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html" . preserve_qs());
10
jontro

もう1つのオプションを追加したい...
とにかく-他の人が言ったように、(。htaccessmod_rewriteを使用するのがおそらく最良のオプションでしょう。

しかしながら、
PHP => 2つのオプションがあります:

  1. _$_SERVER['QUERY_STRING']_を使用してリダイレクトURIを追加します
  2. 独自に構築されたクエリを使用してリダイレクトURIを追加しますhttp_build_query($_GET);

オプション2-利点(+)

  • パラメーターをエンコードします(デフォルトではPHP_QUERY_RFC1738
  • 次のような_$_GET_パラメータを簡単に追加(または削除)できます。
    _$_GET['new_param']="new value";_(追加)
    unset($_GET['param_to_remove']);(削除)
  • 環境(神が理由を知っている)がQUERY_STRINGを提供しない場合-おそらくスーパーグローバル_$_GET_ =>環境に依存しない
  • http_build_query()の最初のパラメーターは実際には任意の配列またはオブジェクトにできるため、必要に応じて_$_GET_または$o = new YourObject();から_$_POST_のような要求を作成できます。
  • 必要に応じて引数の区切り文字を変更できます

オプション2-欠点(-)

  • この種の構築クエリは冗長( "good-for-nothing")であり、不要な場合があります...
  • クエリが非常に大きい場合(攻撃の可能性があります)、パフォーマンスに影響を与える可能性があります。これは、配列が文字列に変換されてエンコードされるためです。

詳細については http://www.php.net/manual/en/function.http-build-query.php -a PHPについてのマニュアルのサイトhttp_build_query()関数_Returns a URL-encoded string._

7
jave.web

$_SERVER['QUERY_STRING']を使用して、リダイレクトの最後に追加することをお探しの場合があります。

編集:返信が少し遅れたことがわかりました。

3

まず、MODの書き換えでリダイレクトしないのはなぜですか?

ただし、とにかく、$ _ SERVER ['QUERY_STRING']をURLの末尾に連結できます

2
Crayon Violent

また、このタスクに mod_rewrite を使用することをお勧めします。これにより、柔軟性を高めることができます。

1
dasrecht

_$_SERVER['REQUEST_URI']_または_QUERY_STRING_を追加します。 print_r($_SERVER);を実行して、要求されたURLに関する詳細情報を表示します。

1
Alec