Score:1

จะพร็อกซี URL แบบเต็มที่ nginx config ได้อย่างไร

ธง ve

ฉันต้องการตำแหน่งพร็อกซี /v1/api/ ไปยัง URL อื่นเป็น:

ตำแหน่ง /api/v1/ {
        proxy_pass http://frontend-api.preprod.my-app.com/api/v1/;
    }

อย่างไรก็ตาม ที่กระแสหลักจะได้รับเฉพาะกระสุนเท่านั้น:

"GET /api/v1/ HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/96.0.4664.110 Safari/537.36"

เนื่องจากอัปสตรีมได้รับการกำหนดค่าเป็นโดเมนเฉพาะ frontend-api.preprod.my-app.com:

เซิร์ฟเวอร์ {
    ฟัง 80;
    server_name frontend-api.preprod.my-app.com;

   ที่ตั้ง / {
      รูท /var/www/frontend_api/current/public;

      #เปิดใช้งานผู้โดยสาร
      Passenger_enabled บน;
      Passenger_ruby /home/deploy/.rvm/gems/ruby-2.7.2/wrappers/ruby;
    }

}

ผลลัพธ์สุดท้ายคือ 404 วิธีกำหนดค่า proxy_pass ที่พร็อกซีเซิร์ฟเวอร์เพื่อส่งโฮสต์ด้วย เพื่อให้เซิร์ฟเวอร์ที่รับได้รับ URL แบบเต็มแทนที่จะเป็นแค่ /api/v1/ ?

Score:2
ธง us

เอกสาร nginx อธิบายพฤติกรรม:

หากมีการระบุคำสั่ง proxy_pass ด้วย URI เมื่อคำขอถูกส่งไปยังเซิร์ฟเวอร์ ส่วนของ URI คำขอที่ปรับให้เป็นมาตรฐานซึ่งตรงกับตำแหน่งจะถูกแทนที่ด้วย URI ที่ระบุในคำสั่ง:

ในกรณีของคุณ หมายความว่า URI คำขอถูกแทนที่ด้วย /api/v1/ URI ที่ระบุในของคุณ proxy_pass คำสั่ง

หากคุณต้องการให้ URI ส่งผ่านตามที่เป็นอยู่ คุณต้องทำ:

ตำแหน่ง /api/v1/ {
    proxy_pass http://frontend-api.preprod.example.com;
}

ในกรณีนี้ nginx ใช้ URI จากคำขอดั้งเดิมกับ proxy_pass ปลายทางตามที่อธิบายโดย:

หากระบุ proxy_pass โดยไม่มี URI URI คำขอจะถูกส่งผ่านไปยังเซิร์ฟเวอร์ในรูปแบบเดียวกับที่ส่งโดยไคลเอนต์เมื่อคำขอดั้งเดิมถูกประมวลผล หรือ URI คำขอที่ปรับมาตรฐานทั้งหมดจะถูกส่งผ่านเมื่อประมวลผล URI ที่เปลี่ยนแปลง:

หากคุณต้องการแทนที่ส่วนหนึ่งของ URI คำขอด้วยส่วนอื่น คุณต้องใช้การจับภาพนิพจน์ทั่วไป:

ตำแหน่ง ~ ^/แหล่งที่มา/เส้นทาง/(.*) {
    proxy_pass http://example.com/destination/path/$1;
}

แก้ไข:

ในการรับชื่อโดเมนของคำขอเดิมที่ส่งไปยังอัพสตรีม จำเป็นต้องตั้งค่า เจ้าภาพ ส่วนหัว HTTP สำหรับคำขออัปสตรีม:

proxy_set_header โฮสต์ $host;

การส่งที่อยู่ IP ของผู้เข้าชมผ่านส่วนหัวมักจะมีประโยชน์:

proxy_set_header X-ส่งต่อ-สำหรับ $remote_addr;
simo avatar
ve flag
ฉันลอง `proxy_pass http://frontend-api.preprod.example.com;` แต่ที่อีกด้านหนึ่ง ฉันยังคงได้ผลลัพธ์เหมือนเดิม ฉันไม่มีปัญหาในการส่งผ่าน slug ปัญหาคือ URL พื้นฐานไม่ผ่าน เห็นเฉพาะ `/api/v1/` ที่เซิร์ฟเวอร์รับ ไม่ใช่ `http://frontend-api.preprod example.com/api/v1/`
us flag
คุณไม่สามารถส่ง URL แบบเต็มเป็น URI ไปยังคำขอไปยังแบ็กเอนด์ได้ ในการรับชื่อโฮสต์ คุณต้องใช้ส่วนหัว HTTP ฉันเพิ่มตัวอย่างในคำตอบ
simo avatar
ve flag
ขอบคุณ ฉันลองตั้งค่าส่วนหัวของโฮสต์เป็น $host แล้ว แต่หลังจากนั้น ฉันไม่เห็นบันทึกที่เข้ามาใน access.log ของผู้รับ nginx!
us flag
จากนั้นการตั้งค่าชื่อโฮสต์เสมือนของคุณในเครื่องรับ nginx ไม่ถูกต้อง
simo avatar
ve flag
ขอบคุณครับ มีปัญหา..

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา