PDA

View Full Version : クッキーのドメインとパス


ichinose
2002/06/12, 08:43 AM
ハジメマシテ
一ノ瀬裕夜といいます。

CCIで掲示板をつくりました。
クッキー機能をつけようとおもうのですが、

クッキーのドメインとパスをどう設定していいかわかりません。
ちなみに、CGIは
http://yuya.s8.xrea.com/ivtbbs/bbs.xcg
に設置しました。

ドメインは
yuya.s8.xrea.comとしてしまってよいのでしょうか?
それとも、www.xrea.comとかwww.s8.xrea.comとするのでしょうか?
同様に
パスも
/ivtbbs/
としてよいのか
/yuya/ivtbbs/
とすべきなのか…

XREAの
User_Name.Server_Name.xrea.com
がドメインではない(だろう)けれど
あたかもドメインであるかのように記述できるところが
悩みのタネになっています。

どなたかお力添え下さいな♪

carroll
2002/06/12, 09:38 AM
ドメインとパスは、勝手に記録してくれるので特に設定しなくても問題ないのですが。
とりあえずドメインは yuya.s8.xrea.com
パスは /ivtbbs
でどうぞ。

ichinose
2002/06/12, 12:19 PM
>carroll様
ありがとうございます。

ブラウザがクッキーの設定やってくれるとは
ぜんぜん知らなかったです。

本当にありがとうございました。

ocean
2002/06/21, 03:25 PM
Ruby で掲示板を作っているのですが、クッキーがうまく働かない
現象に遭遇しました。

public_html/bbs/
└ index.cgi

という構成にして、bbs/ ディレクトリにアクセスすると、index.cgi が
実行されますよね?
そうした場合、cgi.rb の CGI::Cookie クラスをそのまま使用して
クッキーを出力すると、うまくクッキーが記録されないみたいなんです。
しかし、index.cgi に明示的にアクセスすると、記録も読み込みも
問題なく行えます。

原因は、クッキー記録の際の見かけ上正式な domain/path/ は、

1)ocean.s7.xrea.com/

であるべきなのに(bbs/ にアクセスしているため)、実際に出力される domain/path/ が

2)ocean.s7.xrea.com/bbs/

になっているためだと思い、1)を出力する Cookie オブジェクトを
書き出すようにしてみたところ、記録はされたのですが、今度は
読み込みが行われませんでした(^^;

仕方がないので現在は index.cgi に明示的にアクセスするように
しておりますが、bbs/ ディレクトリにアクセスするだけできちんと
クッキーの読み書きが行われるようにする良い方法はありませんでしょうか?
どなたか知恵をお貸しください。
もしくはご自分のところでは、別にうまく動いているという例がありましたら
教えていただけるとありがたいです。

テスト用コード:index.cgi などのファイル名で保存してください。

#!/usr/local/bin/ruby

require 'cgi'

begin

cgi = CGI.new

value = cgi['test'].nil? ? '' : cgi['test']

cookie_in = cgi.cookies[__FILE__]

cookie_out = CGI::Cookie.new({
'name' => __FILE__,
'value' => value,
#'domain' => '', # この2つをいじるとうまく動くときもある
#'path' => '',
'expires' => Time.now + 3600,
})

cgi.out({
"type" => "text/html",
"charset" => "Shift_JIS",
"language" => "ja",
"cookie" => [cookie_out],
"expires" => Time.now + 3600,
}){
<<-EOH
Cookie In: #{cookie_in.inspect}
<form action="./" method="post">
<input type="text" name="test">
</form>
Cookie Out: #{cookie_out.inspect}
EOH
}

rescue Exception
print "Content-Type: text/html\n\n" << $! << $!.backtrace.join("<br>")
end

raccy
2002/06/22, 05:53 PM
Originally posted by ocean
Ruby で掲示板を作っているのですが、クッキーがうまく働かない
現象に遭遇しました。
(以下略)

色々調べてみました。
どうやら、フォルダにアクセスの場合はクッキーが発行されないようです。
domainもpathも明示して、発行しようとしてもダメでした。
以下、実験で得たHTTPヘッダ情報。
なお、RubyのNet::HTTP#getを使って取得しました。
=="/cgi/text/index.cgi"で受け取った時

date = Sat, 22 Jun 2002 08:24:57 GMT
connection = close
content-type = text/html
x-powered-by = ModLayout/3.0.3
cache-control = no-cache
set-cookie = /virtual/raccy/public_html/cgi/test/index.cgi=; domain=raccy.s1.xrea.com; path=/; expires=Sat, 22 Jun 2002 09:24:57 GMT
server = Apache/1.3.26 (Unix) mod_gzip/1.3.19.1a mod_layout/3.0.3 mod_fastcgi/2.2.12
transfer-encoding = chunked

=="/cgi/test/"で受け取った時

date = Sat, 22 Jun 2002 08:30:09 GMT
connection = close
content-type = text/html
x-powered-by = ModLayout/3.0.3
cache-control = no-cache
server = Apache/1.3.26 (Unix) mod_gzip/1.3.19.1a mod_layout/3.0.3 mod_fastcgi/2.2.12
transfer-encoding = chunked
このように、フォルダアクセスでは、set-cookieだけがスッポリと抜けています。
原因はCGI#outにあると思うのですが、cgi.rbのソースをまだ見てないので、ちょっとわかりません、、、
CGI#outを使わずに、手動でHTTPヘッダを書いた場合はうまく行くかも知れません。

なお、domainを明示し、path="/"とすれば、クッキー読み込みにはIEでは問題ありませんでした。
(なぜか、Operaでは読み込めなかったけど、、、)
色々問題有りそうなので、indexは別にした方がいいかも知れません。

ocean
2002/06/23, 05:56 AM
raccy さん、また丁寧なレスをくださってどうもありがとうございます。

Originally posted by raccy

色々調べてみました。
どうやら、フォルダにアクセスの場合はクッキーが発行されないようです。
domainもpathも明示して、発行しようとしてもダメでした。
以下、実験で得たHTTPヘッダ情報。
なお、RubyのNet::HTTP#getを使って取得しました。
(略)
このように、フォルダアクセスでは、set-cookieだけがスッポリと抜けています。



なるほどー! そういう調べ方もあるんですね!
またひとつ賢くなりました☆(笑) ありがとうございます。
私も同じように調べてみましたら、raccy さんの実験結果と
全く同じになりました。フォルダアクセスの時のみ set-cookie ヘッダ
が出力されていないようです・・。

Originally posted by raccy

原因はCGI#outにあると思うのですが、cgi.rbのソースをまだ見てないので、ちょっとわかりません、、、
CGI#outを使わずに、手動でHTTPヘッダを書いた場合はうまく行くかも知れません。


CGI#out では Apache::request.send_http_header を呼んでいました。
このメソッドは、スクリプトとしてライブラリ提供されておらずに
既に Ruby に組みこまれているらしい? ので、よくわかりませんでした。
Ruby のソースコードを見ればいいんでしょうかね? これから探してみます。

Originally posted by raccy

なお、domainを明示し、path="/"とすれば、クッキー読み込みにはIEでは問題ありませんでした。
(なぜか、Operaでは読み込めなかったけど、、、)


私もそれを確認したのですが、もう一度その条件で Net::HTTP#get を使って
調べてみると、set-cookie ヘッダが出力されていませんでした。
「読み込み」とは、ブラウザがクッキーを覚えてくれるという意味でしょうか?
私は %WINDOWS%\Cookies フォルダを監視するという方法で
調べてましたが(^-^; 実際のヘッダを見てみると出力されてないようなので、
そのときの見間違いだったかも知れません。
「読み込み」が、ブラウザが覚えたクッキーを CGI 側に渡してくれるという
意味でしたら、それは私は確認できませんでした。

Originally posted by raccy

色々問題有りそうなので、indexは別にした方がいいかも知れません。


そうですね(^^; Apache モジュールを調べてみて何も出てこなかったら
素直に index を別にいたします。

(次回へ続く…たぶん)

ocean
2002/06/23, 02:01 PM
やはり raccy さんが指摘なされたように、クッキーヘッダが出力されないのは
フォルダにアクセスすることに問題があるようでした。

Apache モジュール(mod_ruby)のソースファイルをひととおり
見ましたが、クッキーがあやまって出力されないようなコードは
見つかりませんでした。
唯一、cgi.rb の CGI#header メソッドの中の case 文を次のように
定義し直して使ってみましたが、

case name
when 'Set-Cookie'
table.add($1, $2)



case name
when /^Set-Cookie/ni
table.add(name, value)

結果は変わらず、クッキーヘッダはフォルダにアクセスした時のみ
出力されませんでした。

CGI#out を使わずに自前でヘッダを出力するようにしてみましたが、
出力結果は何故か CGI#out を使った場合と全く変わらずでした(^^;
↓こんな感じで

print << -EOH, html_out
Content-Type: text/html
Set-Cookie: #{cookie.to_s}

EOH


私がローカルテストで使用していた AnWeb は、フォルダにアクセスした
時もクッキーヘッダを出力してくれたのですが、他の httpd だと
そうでない場合があるのでしょうかね。
(むしろそれが一般的だと推測します)

というわけで、書き込みの時(クッキーヘッダを出力したい時)に、
CGI スクリプトファイルを明示して(index.cgi などと指定して)アクセスすれば
良い、という結論にいたりました。
これは Ruby に限らず、他の CGI スクリプト全般に当てはまると思います。たぶん(^^;

最後に… レスの際に実験など色々調べていただいた raccy さんに感謝です(^^)/

ichinose
2002/07/18, 08:35 AM
度々ごめんなさい。
上に引き続きC言語でBBS作っているのですが、

一度とったクッキーが途中でメモリから消えてしまい、
うまく表示することができません。

VineLinuxでのローカルテストではうまくいったのですが・・・
実際にUPするとうまくいきません。

設置場所は
http://yuya.s8.xrea.com/ivtbbs/bbs.xcg
(↑広告はホームページにアクセスした際に
フレームを使って表示しております。)
です。

ソースファイルは
http://yuya.s8.xrea.com/bbs.lzh
においてあります。

どなたかご協力ください。

その他、バグや
改良すべき点を見つけた方も、
ぜひよろしくお願いします。

carroll
2002/07/18, 03:30 PM
試しにコンパイルしてみました
/* クッキーの出力 */
printf("Set-Cookie: %s=%s; Expires=%s; path=%s; domain=%s;\n",

をprintf("Set-Cookie: %s=%s; Expires=%s;\n",
とパスとドメインを省略したらcookieが記録されました。

あとcgi.cの最後に改行を入れときましょう。

carroll
2002/07/18, 03:42 PM
#define  C_PATH    "/ivtbbs"
と最後の"/"を削除したら良いみたいです。

ichinose
2002/07/18, 04:05 PM
carrollさん毎回本当にありがとうございます。
早速試してみます。

ichinose
2002/07/18, 09:56 PM
自分でも、いろいろやってみてはいるのですが…
ログを見た感じでどうやらクッキーは
発行されているし、一応取得可能な状態になっているようです。

でも、取得してHTML出力の際には消えているようなんです。

取得してから、(する前かも知れませんが)
HTML出力するまでの過程のどこかで紛失していると思われます。

一番タチがわるいのは現在の環境で
オフラインテストをするときちんと実行されているんです。

ちなみに、オフラインテストの手法ですが…
export HTTP_COOKIE="MAIL>……"
とクッキーを入力して、コマンド実行をしています。

コンパイル&ローカルテスト環境は
Vine Linux 2.0でコンパイラはgccを使いました。

なお、ログは外部から閲覧できるような状態になっています。
(ソースミスしてたのであまりログは取れていませんが…)

ログはBBSと同じ階層にソースのとおりのファイル名でありますので、
よろしければ見てください。

自分でも引き続きがんばって見ます。

協力してくれている方、本当にありがとうございます。

dutch
2002/07/19, 01:30 AM
Win2000+gcc+Apache2 で成功したので、一応報告をします。
#メモリリーク(なじょ)。

carroll
2002/07/19, 10:42 AM
Mozillaのcookieには
MAIL><NAME>carroll<HP_URL><IMG_CLR>black<ICON>01.gif<BLOOD>n<
と記録されてるんですがサーバのHTTP_COOKIEは
IchinoseBBS=MAIL>carrollblack01.gifn<
こんなことになってました。
<>を他の文字に変えてみたらどうでしょう。

ichinose
2002/07/19, 10:56 AM
Originally posted by carroll
Mozillaのcookieには
MAIL><NAME>carroll<HP_URL><IMG_CLR>black<ICON>01.gif<BLOOD>n<
と記録されてるんですがサーバのHTTP_COOKIEは
IchinoseBBS=MAIL>carrollblack01.gifn<
こんなことになってました。
<>を他の文字に変えてみたらどうでしょう。
あ、それで読めなくなったんですね。
<>は処理の時点で実態参照に置き換えているから
区切り文字として安全だと思っていたのに・・・
そんな落とし穴があったとは・・・

本当にありがとうございます。
感謝感謝です。

でも区切り文字ってみんななにを使っているんでしょう?
とりあえず
@、%、~、セミコロン、ピリオド、スラッシュは絶対だめですよね。
クエリーの時に#いれて失敗したことあるのでそれもちょっと怖いかなぁ・・・
シングル、ダブルクォーテーションも怖い。
$とか水平タブとかですね。

文字コード表みてShift_JIS、ASCIIで使ってない文字コードでも
選んで見ることにします。

ichinose
2002/08/01, 03:07 PM
もはや完全に報告スレッドと化していますね。

その後書き換えたものをUPしてみました。
http://yuya.s8.xrea.com/bbs2.lzh

書き換えた内容は

メインルーチンで
クッキー取得ルーチンmem_set_cookie()を呼び、

そのルーチンの最初で
if(getenv("HTTP_COOKIE") == NULL){
return;
}
としています。

次のflg=2
はただのフラグで
flg=2の時にはログにクッキールーチンとおりました
と表示しています。
あとは、
ログにgetenv("http_cookie")
の返すポインタを保存するようにしました。

で、気づいたのですが、


どうやら、
if(getenv("HTTP_COOKIE") == NULL)
の部分がクッキーあるなしにかかわらず常に
成り立ってしまっているようなんですよね。
(成り立っていなければflg=2となり、ログにその旨がしるされるので)
でも、クッキーがブラウザから送られてきたとき、getenv("http_Cookie")の返すポインタは大体0xbffffc28近辺がとログには残っています。
また、クッキーがないときは
nilとログに残ります。
ちなみにNULLの変わりに、nil及びNILを指定するとコンパイルエラーになりました。

if(getenv("HTTP_COOKIE") == NULL){
return;
}
の部分をどうにか変えればよいというところまでは調べがつきましたが、
どうかえればいいか模索している最中です。

なお、NULLのかわりに「0x0」と「0x00」は既に試しました。

どなたかお力添えくださいな。

carroll
2002/08/01, 05:39 PM
REQUEST_METHODは空にはならないですよ。
デフォルトでは"GET"が入ります。

ichinose
2002/08/03, 06:34 PM
Originally posted by carroll
REQUEST_METHODは空にはならないですよ。
デフォルトでは"GET"が入ります。
↑ソレのせいでした。
クッキー取得ルーチンを
REQUEST_METHODのポインタがNULLの時に呼び出していたせいいでした。
おかげで無事解決しました。
ありがとうございます。

クッキー対応開始から2ヶ月。長かったぁ。
ホントめっちゃうれしい。

carrollさん、本当にありがとうございます。

動作テストしてくださったdutchさんもありがとうございました。