Lacoocan(niftyレンタルサーバ), php, session, header に関する質問です。


index.php から postデータを login/login.php に送り、index.php にリダイレクトされる流れで、session_start() と login/login.php 内で header('Location: ../index.php') を記述してあります。
login.php 内で 上記のheader(......)のみの記述でも、login.php の url のままページ遷移が起こりません。try~catch でheader部の記述をはさむと、HTTP500 エラーとなります。

index.php を書き換えると、index.php自信へのリダイレクトはできますが、$_SESSION(setcookieも)は使えませんでした。

何か基本的な記述を忘れているのか、記述が悪いのか、Lacoocan では使えないのか、それともLacoocan内でのエラーなのか、を教えていただけたらと思います。localhost 環境では setcookie、session、header、どれも希望通りに動きました。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/10/10 17:23:45
  • 終了:2009/10/11 13:04:47

回答(1件)

id:KeyKey No.1

KeyKey回答回数29ベストアンサー獲得回数42009/10/10 19:59:08

ポイント60pt

ラクーカンに1つアカウントを持っていたので以下のコードを試してみました。

「/login/login.php」

<?php
$value = 'cookie test';
setcookie("TestCookie", $value, time()+3600, "/");
session_start();
$_SESSION['test'] = "session test";
header('Location: ../index.php');
exit;
?>

「/index.php」

<?php
session_start();
print_r($_COOKIE);
print_r($_SESSION);
?>

結果は以下のものとなります。

「出力結果」

http://www.example.com/login/login.php

GET /login/login.php HTTP/1.1
Host: www.example.com
(略)
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=xxx; TestCookie=cookie+test

HTTP/1.x 302 Moved Temporarily
Server: ZWS
Date: Sat, 10 Oct 2009 10:48:06 GMT
Set-Cookie: TestCookie=cookie+test; expires=Sat, 10-Oct-2009 11:48:07 GMT; path=/
Location: ../index.php
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Transfer-Encoding: chunked
Pragma: no-cache
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
----------------------------------------------------------
http://www.example.com/index.php

GET /index.php HTTP/1.1
Host: www.example.com
(略)
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=xxx; TestCookie=cookie+test

HTTP/1.x 200 OK
Server: ZWS
Date: Sat, 10 Oct 2009 10:48:06 GMT
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Transfer-Encoding: chunked
Pragma: no-cache
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
----------------------------------------------------------
Array
(
    [PHPSESSID] => xxx
    [TestCookie] => cookie test
)
Array
(
    [test] => session test
)

同じラクーカンと言っても違うサーバの可能性が高いのでAKI-NAMIさんの環境もそうだとは言えませんが

setcookie、session、headerそれぞれ正常に動作しています。

ステータスコードが500とのことですので、プログラムの構文エラーを疑ってみてはいかがでしょうか?

http://php.net/manual/ja/function.setcookie.php

id:AKI-NAMI

login.php 実際のコードをそのまま載せると

session_start();

$id = $_POST['id'];

$pass = $_POST['pass'];

if($id == "name" && $pass == "pass"){

$usrid = "usrname";

$_SESSION['usrname'] = $usrid;

header("Location: ../index.php");

}else{

header("Location: ../index.php");

}

?>

で、例えば header であったり、変数の設定の部分でもtry~catchではさむとHTTP500エラー。

上記のままであると、ブラウザのアドレスバー部分にhttp://***.***.coocan.jp/login/login.phpと表示され、index.php へ飛びません。

ちなみにその画面は真っ白で、ソースを見ると4文字分くらいの空白のあとに「1」とだけありました。

localhostでは特に問題なく動いてるのですが。

2009/10/11 01:29:49
  • id:AKI-NAMI
    コード部分最初の"<?php"が消えてますね。はてなの仕様でしょうか。
  • id:KeyKey
    >ソースを見ると4文字分くらいの空白のあとに「1」とだけありました。
    プログラムの「<?php」の前に改行や空白があったり
    session_start,setcookie,headerの前に他プログラムをincludeしていませんか?
    includeしている場合そのファイルの「?>」の後ろに余分な改行が入ってたりしませんか?
    ローカルではCR+LFだったのがFTPでアップしたときにCR2つやLF2つになって余分な改行がHTTPヘッダ出力前に表示されているかも知れません。
  • id:AKI-NAMI
    FTPではなくて、「マイキャビ」というネットワークフォルダを開いてローカルからコピーしています。
    そこから、直接login.phpをPeggyPadで開いて見ても改行コード等には頂いた上記コメントのようなものは見あたりません。

    あ、今Firefoxでlogin.phpへアクセスしたら「・ソ」でした。
    なんか手がかりになるでしょうか。
  • id:AKI-NAMI
    一応、自己解決、しました。
    文字化け?と思って、
    login.php のみ utf8 → utf8n に変更したら、動きました。
    理由は私のレベルではわかりませんでした。

    この質問に関してはこれで終了させていただきます。
  • id:KeyKey
    得心がいきました。
    UTF-8はBOM付きと言ってファイルの先頭に文字コードがUTF-8だと示すBOMが付加されます。
    これがUNIX系OSだとそのままテキストデータだと認識されるため「<?php」の前にBOMが出力されてしまいます、これが「・ソ」となったのだと思います。
    そしてそれがPHPの吐き出すHTTPヘッダより前にあるためCOOKIEも使えずLocationなども起こらなかったのだと思います。
    UTF-8NはBOM出力しないUTF-8なのでPHPを書くときはそちらを使うようにしてください。
  • id:AKI-NAMI
    私のローカルは当然?windowsなのでこのエラーが起こらなかったのですね。
    他のファイルでエラーが起こらなかったのは、header 等が関係ない内容だったからですか・・・

    ajax やるなら utf8 というどこかのサイトにはこのようなことは何も書いてなかったです。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません