web-dev-qa-db-ja.com

header( 'location:..')が機能しない

(1)自分のWebサイトをリモートWebサーバーにアップロードしているところです。

(2)サイトのテンプレートシステムは、URLエンコードされたgetリクエストを_index.php_に送信することによってすべてのページが形成されるように設定されています

(3)初期ページの読み込みは動作します。このページは、フォームの値を評価することにより、次のページの場所を決定します。

(4)次のページへのリダイレクトは、次のように実行されます:header('location: next_page')

(5)何らかの理由で、リダイレクトが実行されない。コードは次のようになります。

_$error = "";
if(isset($_POST['index_choice'])){
    $path_choice = isset($_POST['path']) ? $_POST['path'] : NULL;

    //echo $path_choice;
    //echo $page_inc;

    //nothing after this

    if($path_choice != null){

        if($form->is_connected()){

            //if($path_choice != "" || $path_choice != NULL){
                if($path_choice == "new"){

                    //header('location: /login.php');
                    //header('location: page/login');
                    header('location: /index.php?page=login');
                    exit();

                }
                else{

                    //header('location: /amend.php');
                    //header('location: page/amend');
                    header('location: /index.php?page=amend');
                    exit();
                }
            //}
            /**
            else{
                //destroy_session();
                $error = "You haven't selected a path. Please choose a path";
            }
             *
             */
        }
        else{
            //destroy_session();
            $error = "Problems with connecting to the database";
        }
    }else{
        //destroy_session();
        $error = "You have not indicated your choice";
    }

}
_

[〜#〜]解決済み[〜#〜]

これは、コードのどこかで_?>_の後に空白を入れるという問題でした。これは、次のコマンドをコードの先頭に配置した後で明らかになりました。

_ error_reporting(E_ALL); ini_set('display_errors', 'On'); 
_

手伝ってくれたすべての人々に感謝したいと思います。

13
Fortisimo

Header( 'location')を送信する前に、ブラウザにテキストをエコーし​​ているようです。エコーによってヘッダーが強制的に送信されるため、header()を実行する前にブラウザーにコンテンツを送信することはできません。これらの行をコメントアウトして、機能するかどうかを確認します。

// echo $path_choice;
// echo $page_inc;

これでヘッダーが送信され、リダイレクトされます。

16
Karst Lok

add to this code to first of code:

<?php
ob_start();
?>
13
Erfan Safarpoor

あなたはページをリダイレクトするJavaScriptの方法を試すことができます:

echo '<script>window.location = "'.$url.'";</script>';
10
shasi kanth

単純なPHPスクリプトは次のように動作しますか?

_<?php header('Location: /index.php?page=login'); ?>
_

エラー状態でHTTPヘッダーがまったく設定されていないため、_$path_choice != null_および$form->is_connected() === trueを含むコードパスが実際に使用されることも確認する必要があります。

3
joschi

「destroy_session()」が表示されますが、どこかでsession_start()を使用していますか?コンテンツ((セッション)Cookieを含む)が送信されていないことを確認してください。

デバッグのヒント:error_reporting(E_ALL)を設定します(E_NOTICEを含む)。ヘッダーが送信される行が表示されます。

その他のトラブルの原因:- [〜#〜] bom [〜#〜] -インクルードファイルの前の余分な行

3
Lekensteyn

これを試してみてください。それが動作します

_echo "<script type='text/javascript'>  window.location='index.php'; </script>";
_

代わりにheader("location: index.php");

私はあなたがあなたのif-stackをチェックし、あなたがあなたのループのそれぞれに入っていることを確認する必要があると信じています。各ifステートメントの後にエコーを配置して、header()が評価されていることを確認します。ループが予想よりも早くカットされます。

私の容疑者はnullと$ path_choice!= nullの使用に関係しています。 is_null()またはisset()は、変数がnullかどうかを確認するように特別に設計されているため、試してみましたか?また、この場合も!==オペランドが機能する可能性がありますが、PHPにそれがあるかどうかはわかりません。

2
Nucleon

Phpファイルの_<?php_の前にスペースがないことを確認してください。 _<?php_の直前にBOMとバックスペースなしでファイルエンコードタイプをUTS_8に変更し、ファイル内にsession start()がないことを確認すると役立つ場合があります。それは直後でなければなりません

2
Nerudo

これは重要なので、phpコードの前にスペースがないことを確認してください。

例えば

<?php
some code this is the correct way
?>

--------------

<?php
some code this is the incorrect way the space above matters
?>
1
phpapprentice

さて、すべてを試した場合、この例は役立ちます(HTML/PHP):

<?php
    header("HTTP/1.0 404 Not Found");
    echo '<html>
            <head>
                <meta http-equiv="Refresh" content="0;url=http://www.url.com/index.php?code=404" />
            </head><body></body>
          </html>';
?>
0
Clayton Kappaz

コードの先頭に空白がないことを確認してください

例えば:

------whitespace----
<?php
.
.
.
. ?>

最初の行からスペースを削除して、<?phpは最初の行になければなりません。

0
Harpal Singh