0

ここにいるほとんどの人にとって簡単な質問があります。Web サイトで、visit.php という 1 つの単純な PHP リダイレクトを介してすべてのリンクをリダイレクトしています。

私はこのようにアウトバウンドリダイレクトをフォーマットしています..

visit.php?url=google.com
visit.php?url=yahoo.com
visit.php?url=aol.com

次に、私のvisit.phpは次のようになります...

<?php
$url = htmlspecialchars($_GET['url']);

if($url == 'google.com'){
header("Location: http://google.com");
}

if($url == 'yahoo.com'){
header("Location: http://yahoo.com");
}

if($url == 'aol.com'){
header("Location: http://aol.com");
}

else {
header("Location: http://mydomain.com/404");
}

私が抱えている問題は、elseステートメントにあります。スクリプトから削除すると、すべてが期待どおりに機能します。これを挿入すると (スペルミスがあると 404 にリダイレクトされます)、スクリプトで定義したすべてのリンクが上書きされ、404 にリダイレクトされます。

私が抱えているもう 1 つの問題は、?url= 変数が使用されていない場合です。私のサイトのユーザーがリンクをクリップボードにコピーし、それを ?url= 以外の何かに変更した場合、404 にリダイレクトしたいと思います。これを達成するために使用しようとしたコードは次のようになります...

if(!isset($_GET['url'])){
header("Location: http://mydomain.com/404");
}

私の論理は... ?url= 変数が設定されていない場合は、誰かが遊んでいるに違いないため、404 にリダイレクトするだけです。誰かが visit.php?id=blah をロードした場合、404 にリダイレクトする必要があります。

ただし、期待どおりの動作が得られません。私はPHPとプログラミング全般にかなり慣れていないので、これらの質問が幼稚園レベルである場合はご容赦ください。ありがとう。

4

6 に答える 6

4

if//コンストラクトを使用する必要がありますelse if。それ以外のelse場合、else ステートメントは最後のif.

その最後の条件がif満たされない場合、それは自然にelse句を実行します。

あなたの最初のアプローチ(修正):

<?php
$url = htmlspecialchars($_GET['url']);

if($url == 'google.com'){
    header("Location: http://google.com");
}

else if($url == 'yahoo.com'){
    header("Location: http://yahoo.com");
}

else if($url == 'aol.com'){
    header("Location: http://aol.com");
}

else {
    header("Location: http://mydomain.com/404");
}

通常のアプローチ:

    <?php
$url = htmlspecialchars($_GET['url']);

if($url == 'google.com'){
    header("Location: http://google.com");
    exit;
}

if($url == 'yahoo.com'){
    header("Location: http://yahoo.com");
    exit;
}

if($url == 'aol.com'){
    header("Location: http://aol.com");
    exit;
}

header("Location: http://mydomain.com/404");
exit;

最良の (推奨される) アプローチ:

switch($url) {
    case 'google.com':
        header("Location: http://google.com");
        break;
    case 'yahoo.com':
        header("Location: http://yahoo.com");
        break;
    case 'aol.com':
        header("Location: http://aol.com");
        break;
    default:
        header("Location: http://mydomain.com/404");
        break;
}

うーん...さらに良い:

$list_of_places = array(
    'google.com',
    'yahoo.com',
    'aol.com'
);

if(in_array($url, $list_of_places)) {
    header("Location: http://".$url);
    exit;
}
else {
    header("Location: http://mydomain.com/404");
    exit;
}
于 2012-08-17T12:22:41.783 に答える
3

を発行した後も、コードは引き続き実行されますheader('Location: ...')。後続のヘッダーは、以前に設定されたヘッダーを上書きします。これ以上何もしたくない場合は、コードの実行を停止する必要があります。

header(...);
exit;

また、ステートメントが互いにリンクされていないためelse、最後の のみに適用されます。if

于 2012-08-17T12:23:34.523 に答える
2

そのはず

<?php
$url = htmlspecialchars($_GET['url']);

if($url == 'google.com'){
header("Location: http://google.com");
}

else if($url == 'yahoo.com'){
header("Location: http://yahoo.com");
}

else if($url == 'aol.com'){
header("Location: http://aol.com");
}

else {
header("Location: http://mydomain.com/404");
}
?>
于 2012-08-17T12:25:59.303 に答える
2

怠惰なプログラマーとして、私はあなたのコードを次のように書き直すことをお勧めします

   $url = htmlspecialchars(!empty($_GET['url'])?$_GET['url']:"");

    switch($url)
    {

      case 'google.com': 
         header("Location: http://google.com");
         break;
      case 'yahoo.com': 
         header("Location: http://yahoo.com");
         break;
      case 'aol.com': 
         header("Location: http://aol.com");
         break;
      default:
         header("Location: http://mydomain.com/404");
    }
于 2012-08-17T12:28:30.330 に答える
2

if else代わりに、if(最後の'else'ステートメントを実行しているため)次のいずれかを使用します。

<?php
    $url = htmlspecialchars($_GET['url']);
    if($url == 'google.com'){
        header("Location: http://google.com");
    } else if ($url == 'yahoo.com') {
        header("Location: http://yahoo.com");
    } else if ($url == 'aol.com'){
        header("Location: http://aol.com");
    } else {
        header("Location: http://mydomain.com/404");
    }
?>

または、switchステートメントを使用します。

<?php
    $url = htmlspecialchars($_GET['url']);
    switch ($url) {
        case 'google.com':
            header("Location: http://google.com");
            break;
        case 'yahoo.com':
            header("Location: http://yahoo.com");
            break;
        case 'aol.com':
            header("Location: http://aol.com");
            break;
        default:
            header("Location: http://mydomain.com/404");
    }
?>

これらの解決策のいずれかを使用$urlして、あなたが望むものと等しくない場合、ユーザーはあなたの404ページに誘導されます。

于 2012-08-17T12:29:33.417 に答える
0

OK、「別のキーが試行された場合に 404 にリダイレクトする」問題を理解しました (最初の宣言にエラー制御演算子を追加しただけです)。

私のコードは次のようになります...

<?php

$url = @htmlspecialchars($_GET['url']);

if(!isset($_GET['url'])){
header("Location: http://mydomain.com/404");
exit;
}

elseif($url == 'google.com'){
header("Location: http://google.com");
exit;
}

elseif($url == 'yahoo.com'){
header("Location: http://yahoo.com");
exit;
}

elseif($url == 'aol.com'){
header("Location: http://aol.com");
exit;
}

else{
header("Location: http://mydomain.com/404");
exit;
}
于 2012-08-17T12:59:17.437 に答える