web-dev-qa-db-ja.com

POSTリクエストで405(許可されていません)

Winginxで問題が発生する前にすべてが機能しました。 POSTメソッドでJqueryを使用してデータを送信すると、405(許可されていません)エラーが発生します。GETは完全に正常に動作します。

/ formcheck(forcmcheck.phpであり、それ自体で正常に動作します)からデータを要求すると、このエラーが発生します。 Nginxログでは、書き換えエンジンの数行を除いて何も変更していません。

ログを見ることができます:

127.0.0.1 - - [07/Jun/2017:15:14:06 +0300] "POST /formcheck HTTP/1.1" 405 575 "http://music-portfolio.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
127.0.0.1 - - [07/Jun/2017:15:16:35 +0300] "POST /formcheck HTTP/1.1" 405 575 "http://music-portfolio.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
127.0.0.1 - - [07/Jun/2017:15:17:32 +0300] "POST /formcheck HTTP/1.1" 405 575 "http://music-portfolio.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

データが転送された以外はすべて問題ありません。 nginxと仮想ホストの構成は次のとおりです:Nginx.conf: https://www.dropbox.com/s/oh2ifs8oul6jyrl/nginx.conf?dl=

仮想ホストの設定: https://www.dropbox.com/s/00it5g2npmrhbq2/music-portfolio.com.conf?dl=

POSTをブロックする方法と場所はわかりませんが、許可する必要があります... Thxに注意してください。

2
Telion

通常、これらのエラーメッセージは、NginxがPOST requestで静的コンテンツを提供できないという制限が原因で発生します。この問題については、InValidLogic.comの記事 Serving Static Content Via POST From Nginx で説明されており、回避策が示されています。この場合、エラーメッセージをerror_page 405 =200 $uri;に置き換えるか、静的コンテンツのプロキシ、POSTリクエストをGETに変換します。

ただし、この場合、/formcheckは実際には静的コンテンツではなくPHPスクリプトなので、POSTリクエストはNginxによって許可される必要があり、POSTデータが受け取るので、GETへの変換もオプションではありません。

locationセクションが2つあるようです:

    location / {
        if ($Host ~ ^(www\.)?([a-z0-9\-\.]+)$){
            root home/$2/public_html;
            access_log  logs/$2-access.log  main;
        }
    }

    location ~ \.php$ {
        if ($Host ~ ^(www\.)?([a-z0-9\-\.]+)$){
            root home/$2/public_html;
            access_log  logs/$2-access.log  main;
        }
        if (!-e $document_root$document_uri){return 404;}
        fastcgi_pass localhost:9071;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

ご覧のように、.phpで終わる場所のみがfastcgiで処理されますが、/formcheckを含むその他すべては静的なコンテンツのみを提供するlocation /に分類され、405エラーが発生します。

7
Esa Jokinen