Score:1

Nginx proxy_redirect พร้อมเส้นทางสัมพัทธ์

ธง gq

ฉันไม่ใช่ผู้เชี่ยวชาญรายใหญ่ในการดูแลระบบ nginx ฉันเป็นเพียงนักพัฒนา ฉันมีสองแบ็กเอนด์ทำงานในนักเทียบท่า ให้ฉันตั้งชื่อพวกเขา

  • แบ็กเอนด์ 1:8080
  • แบ็กเอนด์ 2:8081

นอกจากนี้ฉันยังมี Nginx ที่เปิดเผยพอร์ต 443 พร้อมติดตั้งใบรับรอง letsencrypt การกำหนดค่า Nginx ของฉันคือ (ตัวแปร env FQDN เป็นเหมือน example.com)

แบ็กเอนด์ต้นน้ำ 1 {
  เซิร์ฟเวอร์แบ็กเอนด์ 1:8080;
}

แบ็กเอนด์ต้นน้ำ 2 {
  เซิร์ฟเวอร์แบ็กเอนด์ 2:8081;
}

เซิร์ฟเวอร์ {
  ฟัง 443 ssl;
  
  ชื่อเซิร์ฟเวอร์ ${FQDN} www.${FQDN};
  
  ssl_certificate /etc/letsencrypt/live/${FQDN}/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/${FQDN}/privkey.pem;
  ssl_session_cache ที่แชร์:SSL:1m;
  ssl_session_timeout 5 นาที;
  ssl_ciphers สูง:!aNULL:!MD5;
  เปิด ssl_prefer_server_ciphers;

  ถ้า ($server_port = 80) { ตั้ง $https_redirect 1; }
  ถ้า ($host ~ '^www\.') { ตั้ง $https_redirect 1; }
  ถ้า ($https_redirect = 1) { ส่งคืน 301 https://${FQDN}$request_uri; }
  
  ตำแหน่ง /path1/ {
    
    proxy_pass http://backend1/;

    proxy_redirect ~^/(.*) $scheme://$http_host/path1/$1;
    
    proxy_http_version 1.1;
    
    proxy_pass_header Set-Cookie;
    คุกกี้ proxy_pass_header;
    proxy_pass_header X-ส่งต่อ-สำหรับ;

    proxy_set_header อัพเกรด $http_upgrade;
    proxy_set_header การเชื่อมต่อ "อัพเกรด";
    proxy_set_header โฮสต์ $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-สำหรับ $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy จริง;
    add_header X-อัปสตรีม $upstream_addr;
  }
  
  ตำแหน่ง /path2/ {
    
    proxy_pass http://backend2/;

    proxy_redirect ~^/(.*) $scheme://$http_host/path2/$1;
    
    proxy_http_version 1.1;
    
    proxy_pass_header Set-Cookie;
    คุกกี้ proxy_pass_header;
    proxy_pass_header X-ส่งต่อ-สำหรับ;

    proxy_set_header อัพเกรด $http_upgrade;
    proxy_set_header การเชื่อมต่อ "อัพเกรด";
    proxy_set_header โฮสต์ $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-สำหรับ $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy จริง;
    add_header X-อัปสตรีม $upstream_addr;
  }
}

ฉันต้องการสิ่งนั้นถ้าฉันขอ https://exapmle.com/path1/ จากนั้น Nginx ควรไปที่ http://backend1:8080/ และตอบกลับฉันจากเซิร์ฟเวอร์นั้น ปัญหาคือ backend1 (เช่นเดียวกับ backend2) สามารถตอบสนองด้วย 302 และเปลี่ยนเส้นทางไปยังบางเส้นทางเช่น /เข้าสู่ระบบ. Nginx เปลี่ยนเส้นทางเบราว์เซอร์ของฉันไปที่ https://exapmle.com/login แต่ฉันต้องการให้มันเปลี่ยนเส้นทางฉันไปที่ https://exapmle.com/path1/login คุณช่วยฉันหน่อยได้ไหมและชี้ไปที่ข้อผิดพลาดที่ฉันทำในการกำหนดค่าของฉัน ฉันได้ตรวจสอบคำถามที่คล้ายกันทั้งหมดใน SO แล้วและไม่พบวิธีแก้ปัญหาใด ๆ ฉันยังได้สำรวจเอกสารประกอบของ Nginx และยังไม่พบคำตอบ

ฉันมีสาย proxy_redirect ~^/(.*) $scheme://$http_host/path1/$1; และฉันคิดว่ามันจะต้องทำงานที่ฉันต้องการ

BTW ฉันไม่สามารถครอบครอง / ตำแหน่ง (สร้างการกำหนดค่าสำหรับเส้นทางรูท) ในการกำหนดค่า Nginx ของฉันเนื่องจากสงวนไว้สำหรับเซิร์ฟเวอร์แบ็กเอนด์อื่น ขอบคุณล่วงหน้า.

Richard Smith avatar
jp flag
พารามิเตอร์แรกของคำสั่ง "proxy_redirect" ต้องตรงกับสตริงข้อความที่ส่งคืนในส่วนหัว "ตำแหน่ง" ของการตอบกลับ 302คุณควรใช้ `curl -I` เพื่อระบุข้อความที่ถูกต้องของส่วนหัว
Michael Hampton avatar
cz flag
คุณต้องกำหนดค่าแอปพลิเคชันส่วนหลังของคุณเพื่อสร้าง URL ดังกล่าว ไม่ทราบว่าคุณกำลังให้บริการเส้นทางที่ /path1 (หรือ /path2 หรืออะไรก็ตาม) เว้นแต่คุณจะบอกอย่างชัดเจน
Herman Sid avatar
gq flag
@MichaelHampton น่าเสียดายที่แบ็กเอนด์เหล่านี้ไม่สามารถกำหนดค่าสำหรับการใช้งานพร็อกซี เป็นแอปพลิเคชันของบุคคลที่สามและไม่มีการตั้งค่าใด ๆ สำหรับสิ่งนั้น
Herman Sid avatar
gq flag
@RichardSmith ใช่ ฉันก็คิดเหมือนกัน regex 'proxy_redirect' ของฉันไม่โดนตำแหน่งการเปลี่ยนเส้นทางที่ส่งคืน ฉันได้ตรวจสอบและพบว่าแบ็คเอนด์ตอบกลับด้วย '/ เข้าสู่ระบบ' ในส่วนหัวของสถานที่ Nginx รวมเข้ากับชื่อโดเมนและฉันได้รับ 'https://example.com/login' ดังนั้น Nginx จึงไม่ตรงกับ '~^/(.*)' และไม่เพิ่มคำนำหน้า
Score:0
ธง jp

อาจเป็นเพราะ X-Forwarded-Headers ที่สะกดผิดในการกำหนดค่าของคุณ มันควรจะเป็น X-ส่งต่อ-* แทน X-ไปข้างหน้า-*.

โพสต์คำตอบ

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