質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

解決済

1回答

11963閲覧

ApacheのPUTメソッドで 405 Method Not Allowed になるのはなぜ

4477

総合スコア91

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

0グッド

1クリップ

投稿2017/07/13 10:53

編集2017/07/14 00:37

Apacheの挙動について質問です。

以下のように、txtやhtmlにPUTリクエストやDELETEリクエストを送ると、405エラーになります。

$ curl http://localhost/readme.txt -X PUT
$ curl http://localhost/test/index.html -X DELETE
→ 405 Method Not Allowed

phpに対してだと、200でレスポンスが返ってきます。

$ curl http://localhost/index.php -X PUT
→ 200

テキスト、画像、HTMLなど静的なファイルはPUTやDELETEは受け付けたくない。
phpなど動的な処理はなんでも受け付けてプログラム側で対応すればよい。
という雰囲気は、意味合い的には分かるのですが、
きちんと「ここで設定されているから」といった根拠が見つけられません。

httpd.confには書いてなさそうですが、
Apacheのデフォルト値だとしたら、マニュアルのどこかに書いてあるでしょうか。

WebDAVをOnにするとPUTできるようになったりするのも
雰囲気はわかるのですが、
yumでインストールしたほぼそのままなどごく普通の状態では、自動的にPUTで405になるのはなぜだろう?という疑問です。

ApacheのデフォルトのハンドラーはPUTやDELETEに405を返すようになっていて、
phpを有効にした環境などでは AddHandler php5-script .php などをしてハンドラーがデフォルトではなくて、そのハンドラーによりけりで、PUTでもDELETEでもHOGEでも受け付けるということでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

考察は正しい。自分でソースコードを読んでみることをお勧めする。

GitHub - apache/httpd: Mirror of Apache HTTP Server

server/core.cより抜粋。4864行目あたり

c

1static int default_handler(request_rec *r) 2{ 3 conn_rec *c = r->connection; 4 apr_bucket_brigade *bb; 5 apr_bucket *e; 6 7// 中略 8 9 if (r->method_number == M_GET || r->method_number == M_POST) { 10 if (r->finfo.filetype == APR_NOFILE) { 11 ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00128) 12 "File does not exist: %s", 13 apr_pstrcat(r->pool, r->filename, r->path_info, NULL)); 14 return HTTP_NOT_FOUND; 15 } 16 17// 中略 18 19 } 20 else { /* unusual method (not GET or POST) */ 21 if (r->method_number == M_INVALID) { 22 /* See if this looks like an undecrypted SSL handshake attempt. 23 * It's safe to look a couple bytes into the_request if it exists, as it's 24 * always allocated at least MIN_LINE_ALLOC (80) bytes. 25 */ 26 if (r->the_request 27 && r->the_request[0] == 0x16 28 && (r->the_request[1] == 0x2 || r->the_request[1] == 0x3)) { 29 ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00134) 30 "Invalid method in request %s - possible attempt to establish SSL connection on non-SSL port", r->the_request); 31 } else { 32 ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00135) 33 "Invalid method in request %s", r->the_request); 34 } 35 return HTTP_NOT_IMPLEMENTED; 36 } 37 38 if (r->method_number == M_OPTIONS) { 39 return ap_send_http_options(r); 40 } 41 return HTTP_METHOD_NOT_ALLOWED; 42 } 43}

追記

デフォルトのハンドラーはこういう動作をしますよとマニュアルやドキュメントに書いてあると、
実装としてどうなっているかは別として
仕様としてはそうなんだなと納得できるのですが。

Apache のハンドラの使用 - Apache HTTP サーバ バージョン 2.4

  • default-handler:default_handelr() を使ってファイルを送ります。 静的なコンテンツを扱うときにデフォルトで使用されるハンドラです。 (core)

※原文ママ
ドキュメントの記述はこの程度で、挙動についての記述は無く、あとはハンドラの作り方の話になってしまいますね。

投稿2017/07/14 17:26

編集2017/07/21 03:26
izkn

総合スコア1698

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

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

4477

2017/07/21 00:53

ソースコードを検索して、その部分は見つけたのですが、 ソース全体、処理の流れなどは把握できておらず、 「とてもそれっぽい箇所」ではあるのだけど、そこだとは断定できず ちょっともやもやしてます。 (全部読めばいいのでしょうけど) デフォルトのハンドラーはこういう動作をしますよとマニュアルやドキュメントに書いてあると、 実装としてどうなっているかは別として 仕様としてはそうなんだなと納得できるのですが。 でもたぶんソースのその部分ですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問