🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1513閲覧

Ruby CGIをローカルからcurlを送りテストしたい

qiyuren

総合スコア29

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2021/01/19 06:53

前提・実現したいこと

以下のような、ローカルPCにあるtest1.rbをcurlで呼びたいのですが、エラーがでてしまいます。

原因をご教授いただけませんでしょうか。

発生している問題・エラーメッセージ

$ curl localhost/Users/***/Desktop/***/***/test1.rb?a=hoge curl: (7) Failed to connect to localhost port 80: Connection refused

該当のソースコード

test1.rb

ruby

1require "cgi" 2 3cgi = CGI.new() 4a = cgi["a"] 5 6puts a 7

試したこと

curl localhost/Users/***/Desktop/***/***/test1.rb?a=hoge
curl 127.0.0.1:80/Users/***/Desktop/***/***/test1.rb?a=hoge
curl http://127.0.0.1:80/Users/***/Desktop/***/***/test1.rb?a=hoge

全て同じエラーが出ました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2021/01/19 07:00

エラーメッセージからは、localhostのTCP 80ポートでウェブサーバー(ApacheやNginx等)が動いていないように見えます。
qiyuren

2021/01/19 07:40

おっしゃる通りでした。 sudo appachetcl startでlocalhostに接続されましたが、改めてcurlすると404エラーが返ってきました。 rbファイルの置き場所が違うのでしょうか。
ockeghem

2021/01/19 09:08

OS(ディストリビューション)の種類とバージョンは何でしょうか? 例: macOS、Ubuntu、CentOS、Debian ...
qiyuren

2021/01/19 12:03

macOS Catalina 10.15.7です
guest

回答2

0

Mac標準のApacheだと仮定すると以下のようにできるかと思います。

httpd.confの設定変更(2箇所)

sudo vi /etc/apache2/httpd.conf

以下箇所を変更します。コメントアウトすることと、cgi-scriptの設定に.rbを追加することですね。

#LoadModule cgi_module libexec/apache2/mod_cgi.so ↓ LoadModule cgi_module libexec/apache2/mod_cgi.so #AddHandler cgi-script .cgi ↓ AddHandler cgi-script .cgi .rb

apacheを再起動します。

$ sudo apachectl restart

CGIスクリプトを以下の場所に格納します。拡張子は.cgiまたは.rbでできるはずです。スクリプトには実行権限をつけることを忘れずに。

/Library/WebServer/CGI-Executables

以下のURLでアクセスします。

http://localhost/cgi-bin/test1.rb

投稿2021/01/19 12:47

ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qiyuren

2021/01/19 14:15 編集

ご丁寧な回答、まことにありがとうございます。 いただいたアドバイスに習いまして、(+シバンを入れました)クエリを入れないで実行するとInternal Server Errorははかなくなったのですが、http://localhost/cgi-bin/test1.rb?a=hogeとするとやはり、Internal Server Errorが出てしまいます。 権限は777にしました
guest

0

ベストアンサー

404エラー

ドキュメントルートについて学びましょう。

投稿2021/01/19 11:24

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qiyuren

2021/01/19 12:32

ありがとうございます。レスポンスきました。 ただ、curlするとそのままスクリプトの中身が出力されます。 hogeと出力するにはどのようにすればいいのでしょうか。 curl localhost/test1.rb?a=hoge #=> require "cgi" cgi = CGI.new() a = cgi["a"] puts a
otn

2021/01/19 13:02

ウェブサーバーに、拡張子rbのファイルをCGIとして実行する設定が必要です。 Apacheだとすると、 AddHandler cgi-script .rb さらに、CGIスクリプトファイル側にも、コマンドとして実行される設定が必要です。 shbang行、実行可能属性。
otn

2021/01/19 14:19

Internal Server Errorが出たら、Apacheのerror_logを見ましょう。
qiyuren

2021/01/19 14:29

[cgi:error] [pid 6219] [client ::1:59332] malformed header from script 'test1.rb': Bad header: hoge とあったので、ヘッダーが問題のようで。。
otn

2021/01/19 14:37

CGIの出力は、 1.少なくともContent-Typeを含んだ一連のレスポンスヘッダー 2.空行 3.応答データ本体 という構成です。 1で最低限、Content-Type ヘッダーの出力が必要です。
qiyuren

2021/01/19 14:37

print "Content-type: text/html; charset=Shift_JIS\n\n" を入れたら、出力されました。
qiyuren

2021/01/19 14:41

わかりやすいご説明、誠にありがとうございました。
otn

2021/01/19 14:42

あ、自力で解決されましたね。おめでとうございます。 HTMLを出力しているわけじゃないので、text/htmlじゃなくてtext/plainのほうが良いかもしれません。
qiyuren

2021/01/19 15:29

了解です。cgiの仕組み、わかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問