人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kyoko55
●カテゴリ:ウェブ制作
✍キーワード:HTTP httpd PHP URL アドレスバー
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● skky
●22ポイント

http://www.php.net/manual/ja/function.header.php

PHP: header - Manual

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

◎質問者からの返答

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


2 ● izayoimizuki
●22ポイント

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

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

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

include (”/hoge2.php”);

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

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

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

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

◎質問者からの返答

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

オライリー・ジャパンの「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のモジュールとして動いているか否かの

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


3 ● nacbox
●22ポイント

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

REQUIRE(”/hoge2.php”);

じゃないでしょうか。

◎質問者からの返答

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

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

いかないんですよねえ。


4 ● tomocky1
●22ポイント

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”)

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

http://httpd.apache.org/docs-2.0/mod/mod_alias.html#alias

mod_alias - Apache HTTP Server

◎質問者からの返答

実際に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では異なるんですね。


5 ● typista
●22ポイント

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

これで、

http://www.hogehoge.com/catalog/1/2/3

は、

http://www.hogehoge.com/cgi-bin/search.cgi?query=1/2/3

として実行されます。

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

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

---

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ