hoge1.phpにて絶対パス指定

header(”Location: /hoge2.php”);
にすれば内部リダイレクトにより転送前のURL(hoge1.php)のまま、
hoge2.phpの中身を表示すると認識(いや、HTTP関連のオライリー本に書いてあります)
していたんですが、アドレスバーのURLはhoge2.phpになり、
内部リダイレクトは行われていない模様です。
httpd.confの設定が何かおかしいのでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/02/07 12:23:28
  • 終了:--

回答(5件)

id:skky No.1

skky回答回数98ベストアンサー獲得回数42005/02/07 12:35:57

ポイント22pt

直接の回答ではなくて申し訳ないですがinclude()を使ってはどうでしょうか。

id:kyoko55

そういう代替策もありましたね。

2005/02/10 11:46:14
id:izayoimizuki No.2

izayoimizuki回答回数302ベストアンサー獲得回数02005/02/07 14:19:45

ポイント22pt

Locationヘッダはリダイレクトをするためのものです。

逆にURLの表示が変わらないとアドレスバーが

偽装されているということになります。

include (”/hoge2.php”);

のようにinclude関数で埋め込めば

埋め込まれたものの如何に関わらず

あくまでも読み込まれたものはhoge1.phpなので

hoge1.phpがアドレスバーに表示されます。

id:kyoko55

書籍を引用させてもらいますが、

オライリー・ジャパンの「CGIプログラミング第2版」

Scott Guelich, Shishir Gundavaram, Gunther Birznieks著によれば

----

次のようにLocationヘッダに転送先のURLを指定して出力します。

print ”Location: static_response.html¥n¥n”;

URLは、絶対パスでも相対パスでも構いません。絶対URLまたは相対パスによる相対URLは

ブラウザに転送され、そのURLへのリクエストが新たに生成されます。相対URLをフルパス

で指定すると、内部的なリダイレクトが生成されます。内部リダイレクトは、ブラウザに返され

ることなくWebサーバ内で処理されます。サーバは、新しいリクエストを受け取ったかのよう

に新しいリソースを取得しますが、クライアントに新しいリソースの内容を返す際にはあたかも

CGIスクリプトの出力であるかのように返します。これにより、ネットワーク上でのレスポンス

やリクエストの発生を避けることができ、ユーザにとっては応答が速くなります。リダイレクト

では、ユーザのブラウザに表示されるURLは、元のCGIスクリプトのURLのままとなります。

----

とあります。「絶対URL」「相対パスによる相対URL」「相対URLをフルパス」という説明が

ややこしいですけど、私の質問で使用した「絶対パス」は、本でいうところころの

「相対URLをフルパス」に該当していると思います。事実、本にある図には

「Location: http://www.ora.com/index.html

「Location: /index.html」

の2種類の場合の遷移図があり、前者は、一旦ブラウザに再リクエストを要求し、

後者はサーバ内部で処理される流れが書かれています。

引用の例は、perlによるものですが、phpのheaderと本質は変わらないはずです。

もしperlとphpに違いがあるとしたら、Apacheのモジュールとして動いているか否かの

違いは何か関係あるのでしょうか。

2005/02/10 16:43:51
id:nacbox No.3

nacbox回答回数81ベストアンサー獲得回数42005/02/07 18:07:54

ポイント22pt

内部リダイレクトさせるのは、

REQUIRE(”/hoge2.php”);

じゃないでしょうか。

id:kyoko55

うーん、代替策があるにせよ、2でのコメントで

示したように、なぜうまくいかないか、納得が

いかないんですよねえ。

2005/02/10 16:51:06
id:tomocky1 No.4

tomocky1回答回数16ベストアンサー獲得回数02005/02/09 16:16:09

ポイント22pt

http://httpd.apache.org/docs-2.0/misc/rewriteguide.html

URL Rewriting Guide - Apache HTTP Server

header(”Location: /hoge2.php”);

この関数だと、metaタグに

<meta http-equiv=”reflesh” content=”0; URL=”/hoge2.php”>

と書いたのと同じ状況で(厳密には違うかもしれないですが)

それをPHPで出力する形になると思います。

したがって、純粋に ”hoge1.php”から”hoge2.php”にリダイレクトするだけで終わってしまいます。

おそらく、ご希望の通りにはPHPでは動かないのではないでしょうか。

もし、URLを”hoge1.php”のまま”hoge2.php”の内容を表示したいのであれば、

httpd.confか.htaccess を使って、”Alias”ディレクティブを使うか、

英語ページしかないですが、rewrite_moduleを使うのがいいのではないでしょうか。

require_once(”hoge2.php”)

で済ませてもいいような気はするんですが。。。。

id:kyoko55

実際にcgi(perl)でも試してみました。

cgiでは、やはり元のURLのままで、目的に適った動作になりました。

そこで、HTTPヘッダを調べるサイトhttp://web-sniffer.net/を使って

cgiとphpでHTTPレスポンスヘッダを見比べてみました。

Location: /index.html

を出力するURLをGETしたのですが、

cgiでは、「200 OK」 で、index.htmlのコンテンツボディを返してきます。

しかし、phpでは

「302 Found」で

Date: Thu, 10 Feb 2005 08:25:22 GMT CRLF

Server: Apache/1.3.33 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7e PHP/4.3.10 CRLF

X-Powered-By: PHP/4.3.10 CRLF

Location: /index.html CRLF

Connection: close CRLF

Transfer-Encoding: chunked CRLF

Content-Type: text/html CRLF

となります。

cgiとphpでは異なるんですね。

2005/02/10 17:49:03
id:typista No.5

typista回答回数359ベストアンサー獲得回数72005/02/10 12:38:10

ポイント22pt

http://yamamaya.com/labo/labo2-1.html

★ やまねこ工房 ★ UNIXサーバー構築・運用・・Apache関係

hoge1.phpを隠したいだけであれば、includeまたはrequire_onceで可能ですが、httpd.confの設定でもこんな方法があるようです。

---

httpd.conf または .htaccess

RewriteEngine on

RewriteRule ^/catalog/?(.*) /cgi-bin/search.cgi?query=$1

これで、

は、

として実行されます。

※mod_rewriteモジュールが必須です

※mod_rewrite関係の設定は、バーチャルホストを利用している場合などで、挿入すべき場所がいろいろ変わるので注意してください。

---

id:kyoko55

みなさん、ありがとうございました。

2005/02/10 17:49:48

コメントはまだありません

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

トラックバック

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

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

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