• ベストアンサー

PerlでIf-Modified-Since取得

Perlで書いているCGIで、 HTTP リクエストヘッダのIf-Modified-Sinceを取得したいのですが、 %ENVには入ってこないようです。 取得する方法があれば、教えて下さい。 ・.htaccess にSetEnvなどで記述することでできそうですが、方法が分かりません。 ・HTTP Request Header 全体を取得する方法でも結構です。 よろしくお願い致します。 環境は、さくらインターネットのレンタルサーバーのApacheです。

  • Perl
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

どうしてもIf-Modifed-Sinceが知りたい場合は、NPHスクリプトを使ってください。 通常CGIでは、Last-Modifed を出力しておけば、If-Modifed-Sinceなリクエストの場合、 CGIが出力したLast-Modifedを元に、Apache側で判定して、全データを返すか「304 Not Modified」を返すかを切り替えてくれます。 CGI側でIf-Modifed-Sinceヘッダの内容を知る必要はありません。 そもそも、通常のCGIでは、出力ステータスを変えられない(「304 Not Modified」を返すことができない)ので、If-Modifed-Since を取得出来ても意味もありません。 一方、NPHスクリプトの場合、ステータス出力などもすべてCGI側で処理する必要がありますが、 そのおかげで必要に応じて 304 を返すことも出来るようになります。 そして、NPHスクリプトであれば、リクエストヘッダの全データが引き渡されますので、If-Modified-Since も、$ENV{HTTP_IF_MODIFIED_SINCE} で参照できます。 http://www.kishiro.com/apache/nph_script.html

amadaira
質問者

お礼

前半が正に的を射てらっしゃいますが、後半の貴重な情報も含め、完璧です。 恐れ入りやした。

関連するQ&A

  • If-Modified-Sinceの設定方法

    If-Modified-Sinceヘッダについて調べているのですが、If-Modified-Sinceが何かというのは書いてあっても、具体的にどのように設定するのか…という方法にたどりつけませんでした。どこになにを書けばいいのかがまったくわかりません。 さくらのレンタルサーバーのライトプランを使っているのですが、.htaccess、htmlファイル、perl等CGI…どこにどのように設定すればいいのでしょうか? コーディングが必要な場合、それは自分で検索しますので、どこに設定すればいいのか…というのを教えてください。お願いします。

  • perlでHTTP Request Headersの情報を取得、表示す

    perlでHTTP Request Headersの情報を取得、表示するページを作成したい 当方初心者です。 apache上のCGI(perl)で、ブラウザから受け取った HTTP Request Headersの情報を取得、出力するページを作成したいのです。 調べると下記のようなサーバ環境変数の取得、表示方法は多数ヒットするのですが =================================================== #!/usr/bin/perl -- print << "DOC1"; Content-type:text/html\n\n <HTML><BODY> DOC1 print $ENV{'HTTP_USER_AGENT'}<br>\n"; print $ENV{'REMOTE_ADDR'}"; print << "DOC2"; </BODY></HTML> DOC2 =================================================== 今回は、環境変数からではなく、HTTP Request Headersから 直接ヘッダに格納された情報を取得したいのです 取得・表示したい情報は標準HTTPヘッダ情報に加え、 途中で経由するプロキシが追加するヘッダ情報です。 完成イメージとしては PHPの<? phpinfo() ?>で出力できる 添付画像にあるような形なのですが どのようにすればできるのでしょうか サンプルの形で教えて頂けると助かります 参考になるページでも結構です よろしくお願いします

  • Apache2でSetEnvが動作しない。

    お世話になります。 Aapche2でCGIの環境変数をセットしたく、 SetEnvを設定したのですが、$ENV{''}で確認しても表示されません。 httpd.conf内の場所を変えて記述してみたり、 .htaccessに記述してみたりしても、いっこうに反映されません。 これは、なにか原因となりうるものはありますでしょうか。 よろしくお願いいたします。 ・記述行 SetEnv PERL5LIB "/usr/local/lib/perl" Apache 2.0.58 FedoraCore 4 perl 5.8.6

    • ベストアンサー
    • CGI
  • HTTPヘッダの取得方法

    PerlにてHTTPヘッダの情報を取得したいと考えています。 通常ならば、 $ENV{'<ヘッダ名称>'} で取得できるはずなのですが、 今回取得しようとしているヘッダはHTTPの標準ヘッダではありません。 proxyサーバにてログインを行い認証されますと、 そのproxyサーバが独自にHTTPヘッダに値を追加する仕様になっています。 テストではJavaですとproxyが設定したヘッダ情報を取得できるのですが、 ことPerlになると取得することができません。 ※Javaと今回動かすPerlは同一サーバで動かします。 HTTP標準以外のヘッダ情報はどのように取得すれば良いのでしょうか? なお、PerlのVerは5.6.1、OSはLinuxです。

  • perlでpostが受け取れない

    perlでCGI を作ってみましたが、POSTでデータが受け取れません。GETは問題ないのですが。read stdin が NULL になります。 ローカルのapache2でテストしています。$ENV{'CONTENT_LENGTH'}がゼロのためだと 思いますが対応が分かりません。 OS:CENTOS6 (VirtualBox) APACHE2.2 Perl 5.10 /var/www/cgi-bin で実行。 呼び出しは <form action='localhost/cgi-bin/uptag.cgi' method='post'"> です。

    • 締切済み
    • CGI
  • Perlで携帯電話の製造番号を取得

    Perlで携帯電話の製造番号を取得 Perlで携帯電話の製造番号を取得するスクリプトを作っています。 docomoのD905iしか持っておらず、他の携帯での動作確認ができません。 以下のスクリプトで正しいでしょうか? 以下のスクリプトで、他にやっておいたほうがよい事など、 何かアドバイスがありましたらお願いします。 やりたいことは、 docomo、au、ソフトバンクのみで取得する。 iPhone、イーモバイルは取得しない。 古い携帯電話で取得できないものは切り捨てる。 携帯電話でアクセスした人が、それぞれに画面をカスタマイズでき、 次回アクセスしたときも同じ画面が表示されるようなサイトを作ろうとしています。 普通はクッキーで本人確認するのだと思いますが、携帯電話ではクッキーが 無いので、代わりに製造番号を使って本人確認しようと考えています。 1ヶ月くらいだけオープンするサイトであり、金銭的な絡みも個人情報も無いので、 携帯電話の所有者が変わったときの問題は無いと思っています。 ■ HTML <a href="./test.cgi" utn>製造番号取得</a> ■ Perl #--ソフトバンク if($ENV{'HTTP_X_JPHONE_UID'} ne ''){ $uid = $ENV{'HTTP_X_JPHONE_UID'}; } #--au elsif($ENV{'HTTP_X_UP_SUBNO'} ne ''){ $uid = $ENV{'HTTP_X_UP_SUBNO'}; } #docomo else{ $agent = $ENV{'HTTP_USER_AGENT'}; $ser_index = index($agent,'ser'); if ($ser_index != -1) { $uid = substr($agent,$ser_index+3); } } print"製造番号:$uid<br>\n"; 以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGIでフォームデータを取得できません

    CGI(perl)の標準入力についてお伺いいたします。 PC上でテストし動作を確認したCGIをプロバイダのCGIサーバに移植しましたが、 正常に実行終了するものの、標準入力によるフォームデータの取得ができません。 フォームデータを受け取る変数が空になってしまいます。 PCとプロバイダのCGIサーバとでは、CGIスクリプトの記述方法が異なるのでしょうか。 書籍、ネットをだいぶ調べましたが、解決策が見当たりませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただきたいです。 (1)PC動作環境 a.OS: Windows 7 b.ブラウザ : Interne Eexplorer 11 c.CGIサーバ: Apache 2.4 d.perl : Activeperl 5.20 (2)CGIスクリプト(標準入力の部分) 尚、フォームでは、method="POST"を指定しております。 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; }

    • 締切済み
    • CGI
  • PHPがCGIモードのサーバでもLast-Modifiedを取得するに

    PHPがCGIモードのサーバでもLast-Modifiedを取得するには? Webサイトを.htmlではなく、.phpで制作しています。共通部分を外部.phpファイル化して作業時間短縮や間違いを防ぐためです。 しかし、自動でrssxml等のRSSやAtomファイルを生成するソフトを使っているのですが、アップされたファイルを開くと、 更新した日が一番上にくるはずなのにそうならず、よく見ると、全てのページの更新日時が同じになってしまっています。これでは更新順にページが並ばず、まるでウソのRSSファイルになってしまいます。 上述のように、.phpファイルでつくっているサイトなので、ローカルでは更新日時がうまく取得できないので Webサーバから取得するようにツールで設定しているのですが、その場合、Last-Modifiedで更新日時を取得して いるソフトだそうで、これで取得できれば良いのですが、これができませんでした。 利用しているサーバのPHPがCGIモードなためだそうです。 もしもモジュールモードであれば、トップページの階層の.htaccessにたった一行記述するだけで 解決するらしいです。 CGIモードでもLast-Modified、つまり更新日時を取得するにはどのような方法があるでしょうか?

    • ベストアンサー
    • PHP
  • perl CGIでのhttpヘッダー出力 (Content-type:

    perl CGIでのhttpヘッダー出力 (Content-type: text/html\n\n) が不要な場合について perlでCGIを作成しています。 多くの場合は、httpのヘッダー出力(Content-type: text/html\n\)を行っています。 毎回ではないですが、HTTPヘッダーの出力が不要な場合が存在します。 (HTMLにContent-type: text/html\n\が出力され表示されます。) そこで、HTTPヘッダーの出力が不要の場合の判断方法を教えていただければと思います。 よろしくお願いいたします。

  • perlでhtmlファイルを取得したいのですが

    perlでmixiなどログイン処理のあるサイトのhtmlファイルを取得したいのですがなかなか上手くいきません。 どなたかご教授をお願いします。 ----------------------------------------------------------------- #!/usr/bin/perl use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request::Common; use LWP::Simple; my $mixi_email = 'メールアドレス@yahoo.co.jp'; my $mixi_password = 'パスワード'; my $login_url = 'http://mixi.jp/login.pl'; my $home_url = 'http://mixi.jp/home.pl'; my $mixi = LWP::UserAgent->new($mixi_email, $mixi_password); #Cookieを有効にする# my $cookie = sprintf('cookie_%s_%s.txt', $$, time); my $cookie_jar = HTTP::Cookies->new(file => $cookie, ignore_discard => 1); $mixi->cookie_jar($cookie_jar); #ログインする# my @form = ('email' => $mixi_email, 'password' => $mixi_password, 'next_url' => $home_url);#POSTで送る内容の配列 my $request1 = &HTTP::Request::Common::POST($login_url, [@form]); #リクエストヘッダの生成 my $response1 = $mixi->request($request1); #ログインする getstore("http://mixi.jp/search_community.pl?from=global(取得先の指定)", "test.html"); ---------------------------------------------------------------------- 試しに書いてみたのですがうまくいきませんでした