expressによって記述されたフロントエンドインターフェイス、要求パスが正しい、または404が返されます。
シナリオ:Tencent Cloudサーバーcentosのポート2020(任意のポート)でexpressによって記述されたフロントエンドインターフェイスを実行しており、WeChat公式アカウント(またはアップルト)が呼び出すために、サーバーnginxを介してこのポートをポート443にリバースプロキシしたいと考えています。
問題:エクスプレスインターフェイスは完全に正常ですが、構成が完了すると、リクエストインターフェイスは404を返しますが、app.get( '/ *'、(req、res)=> {res.json({code :400、データ: 'hahahahahahaha'})})、リクエストインターフェイスは 'hahaha'を返し、他のインターフェイスは404です
エクスプレスインターフェースファイル:
const express = require('express')
const app = express()
app.get('/api/getname', (req, res) => {
console.log('aaaaaa')
res.json({
code: 200,
data: 'aaaaaaaaa',
})
})
app.post('/api/get', (req, res) => {
console.log('post====get')
res.json({
code: 200,
data: 'namenannnaaa',
})
})
app.get('/*', (req, res) => {
console.log('get*///')
res.json({
code: 400,
data: '哈哈哈哈哈',
})
})
app.listen(2020, () => {
console.log('Server has started.port on 2020')
})
Nginx構成:
server {
listen 443 ssl;
server_name program.test.com;
# ....省略配置
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location /program/ { # 微信公众平台接口测试
proxy_pass http://127.0.0.1:2020; # !!!重点,就是这里导致出了问题!!!
proxy_redirect off;
}
}
上で構成したように、ブラウザーにhttps://program.test.com/program/api/getnameと入力 すると、インターフェイス構成で/ *のコンテンツのみが返されますが、/ api / getnameのコンテンツと正しく一致することはできません。
この問題は土曜日全体を悩ませました、そして私は以下を試みました:
1.最初は、エクスプレスインターフェイスファイルが間違って書かれていると思いました。何度も確認した後、公式ウェブサイトからデモを試しましたが、すべて404でした。この原因を取り除きます。
2.コアフレームワークに変更してインターフェイスを記述します。これは機能しません。インターフェイスも404allを返します。これは、/ *との照合後にのみ、/ *のコンテンツを返し、フレームワークの問題を解消します。
3.ポートを開き、2020ポートを直接使用し、nginxプロキシを使用しないでください。ここでは、サーバーファイアウォールで2020ポートを解放し、サーバーコンソールのセキュリティグループで2020ポートを開く必要があります。構成後、http:/を直接使用し ます。 /program.test.com:2020 / program / api / getname、直接アクセスできないことが判明しました。
ははは、この時点でパスが間違っているので、赤でマークされたプログラムhttp://program.test.com:2020/api/getnameを削除するだけです。ここで、ようやくデータにアクセスして正常に戻りました。 aaaaaa '、それはapiが完全に大丈夫であることを意味します、そして問題はnginx構成でなければなりません(私はエクスプレスを非難しました)
4.問題を解決します
nginxの構成をもう一度確認したところ、手がかりが見つかりました。上記のnginxの構成を確認してください。
ここでは、proxy_pass http://127.0.0.1:2020の後に/を追加する必要があります。理由については、ここを参照してください。
に:
location /program/ { # 微信公众平台接口测试
proxy_pass http://127.0.0.1:2020/; # 以 / 结尾,就不会匹配接口文件中以 /program/ 开头
proxy_redirect off;
}
このように、nginx -sreloadを実行してnginxを再起動することを忘れないでください
次に、https: //program.test.com/program/api/getnameを介して 、最終的に「aaaaaa」を正常に返すことができます。!!