Score:0

เซิร์ฟเวอร์ Nginx ภายใต้ load balancer เมื่อพบ /folder เปลี่ยนเส้นทางไปที่ /folder/ แต่เปลี่ยน URL โฮสต์

ธง yt

ฉันมีการตั้งค่าเซิร์ฟเวอร์ nginx ใน google cloud กำลังเข้าถึงเซิร์ฟเวอร์จากโดเมนโฮสต์ผ่านการชี้ gcloud

แบบนี้:

https://server.com/test/ ชี้ไปที่กลุ่มอินสแตนซ์ที่มีหนึ่งในอินสแตนซ์ที่มี ip http://39.99.99.99.55/project/

และทุกอย่างทำงานได้ดีเว้นแต่คุณจะป้อน

https://server.com/test/folder โดยไม่มีเครื่องหมายทับ

เมื่อคุณทำเช่นนั้นเซิร์ฟเวอร์โฮสต์จะเปลี่ยนเส้นทางไป https://server.com/project/folder/ ซึ่งไม่ใช่โฟลเดอร์ที่กำหนดบนโดเมนโฮสต์

แต่ถ้าคุณป้อนอย่างถูกต้อง: https://server.com/test/folder/ มันทำงานได้อย่างถูกต้องในการแก้ไขไปยังเซิร์ฟเวอร์ ip และรับผลลัพธ์

ดังนั้นเซิร์ฟเวอร์ที่มี nginx จึงพยายามค้นหาโฟลเดอร์และเปลี่ยนเส้นทาง

ถึงกระนั้น ฉันไม่ต้องการให้เปลี่ยนเส้นทางโดยใช้เส้นทางสัมพัทธ์ของเซิร์ฟเวอร์ ฉันต้องการให้มีเส้นทางโฮสต์ที่โหลดบาลานซ์ดังนี้: https://server.com/test/folder ควรเปลี่ยนเส้นทางไปที่ https://server.com/test/folder/ ไม่ https://server.com/project/folder/

นี่คือไฟล์กำหนดค่า nginx ของฉัน:

เซิร์ฟเวอร์ {
    ฟัง 80 default_server;
    ฟัง [::]:80 default_server;

    รูท /home/.www;

    # เพิ่ม index.php ในรายการหากคุณใช้ PHP
    ดัชนี index.php index.html;

    ชื่อเซิร์ฟเวอร์ _;

    # เปิดดัชนีอัตโนมัติ;

    # ให้บริการไฟล์คงที่โดยตรง
    ตำแหน่ง ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
        access_log off;
        #หมดอายุสูงสุด;
    }

    error_log /home/.log/xerror.log;

    การบีบอัด access_log /home/.log/xaccess.log;

    #รวมโครงการ
    ที่ตั้ง ^~ /โครงการ {
      นามแฝง /home/.www/project/public;
      try_files $uri $uri/ @โครงการ;

      ตำแหน่ง ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass ยูนิกซ์:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_read_timeout 180;
        รวม fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
      }
    }

    ที่ตั้ง @โครงการ {
        เขียนใหม่ /project/(.*)$ /project/index.php last;
    }



    ที่ตั้ง / {

        # ความพยายามครั้งแรกในการให้บริการคำขอเป็นไฟล์ จากนั้น
        # เป็นไดเร็กทอรี จากนั้นถอยกลับไปแสดง 404
        try_files $uri $uri/ /index.php?$args;

    }

    # ส่งสคริปต์ PHP ไปยังเซิร์ฟเวอร์ FastCGI
    ตำแหน่ง ~ \.php$ {
        รวมตัวอย่าง/fastcgi-php.conf;

        # ด้วย php-fpm (หรือซ็อกเก็ตยูนิกซ์อื่น ๆ ):
        fastcgi_pass ยูนิกซ์:/run/php/php8.1-fpm.sock;
        fastcgi_read_timeout 180;
        # ด้วย php-cgi (หรือซ็อกเก็ต tcp อื่น ๆ ):
        # fastcgi_pass 127.0.0.1:9000;
    }
} 

วิธีทำให้เซิร์ฟเวอร์ไม่เปลี่ยนเส้นทางเช่นนั้นเมื่อค้นหาโฟลเดอร์

แก้ไข 1 @อีวาน แชตสกี้

ขอให้ได้รับ ขด -v server.com/test/folder เอาต์พุตจากรีเควสต์ นี่คือ:

* ลอง 35.***.160.34:443...
* ตั้งค่า TCP_NODELAY
* เชื่อมต่อกับ server.com (35.***.160.34) พอร์ต 443 (#0)
* ALPN ให้บริการ h2
* ALPN ให้บริการ http/1.1
* ตั้งค่าตำแหน่งการตรวจสอบใบรับรองสำเร็จแล้ว:
* ไฟล์ CA: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (ออก), การจับมือ TLS, สวัสดีลูกค้า (1):
* TLSv1.3 (IN), การจับมือ TLS, สวัสดีเซิร์ฟเวอร์ (2):
* TLSv1.3 (IN), TLS handshake, ส่วนขยายที่เข้ารหัส (8):
* TLSv1.3 (IN), การจับมือ TLS, ใบรับรอง (11):
* TLSv1.3 (IN), TLS handshake, CERT ยืนยัน (15):
* TLSv1.3 (IN), การจับมือ TLS, เสร็จสิ้น (20):
* TLSv1.3 (ออก), TLS เปลี่ยนรหัส, เปลี่ยนข้อมูลจำเพาะของรหัส (1):
* TLSv1.3 (ออก), การจับมือ TLS, เสร็จสิ้น (20):
* การเชื่อมต่อ SSL โดยใช้ TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN เซิร์ฟเวอร์ที่ยอมรับให้ใช้ h2
* ใบรับรองเซิร์ฟเวอร์:
* เรื่อง: CN=server.com
* วันที่เริ่ม: 25 เมษายน 19:19:01 2022 GMT
* วันหมดอายุ: 24 ก.ค. 19:19:00 น. 2022 GMT
* subjectAltName: โฮสต์ "server.com" ตรงกับ "server.com" ของใบรับรอง
* ผู้ออก: C=US; O=Google Trust Services LLC; CN=จีทีเอส CA 1D4
* ใบรับรอง SSL ตรวจสอบตกลง
* การใช้ HTTP2 เซิร์ฟเวอร์รองรับการใช้งานหลายอย่าง
* เปลี่ยนสถานะการเชื่อมต่อ (ยืนยัน HTTP/2)
* การคัดลอกข้อมูล HTTP/2 ในสตรีมบัฟเฟอร์ไปยังบัฟเฟอร์การเชื่อมต่อหลังจากอัปเกรด: len=0
* ใช้ Stream ID: 1 (จัดการง่าย 0x556617a0f2f0)
> รับ /test/quasar HTTP/2
> โฮสต์: server.com
> user-agent: curl/7.68.0
> ยอมรับ: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* ID เซสชัน SSL เก่าเก่า กำลังลบออก
* เปลี่ยนสถานะการเชื่อมต่อ (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 301
< เซิร์ฟเวอร์: nginx/1.20.2
< วันที่: จันทร์ที่ 23 พฤษภาคม 2022 21:04:50 GMT
< ประเภทเนื้อหา: text/html
< ความยาวเนื้อหา: 169
< ที่ตั้ง: http://server.com/project/folder/
< ผ่าน: 1.1 google
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; แม่=2592000
<
<html>
<head><title>301 ย้ายอย่างถาวร</title></head>
<เนื้อหา>
<center><h1>301 ย้ายอย่างถาวร</h1></center>
<hr><center>nginx/1.20.2</center>
</body>
</html>
* การเชื่อมต่อ #0 ไปยังโฮสต์ server.com ยังคงอยู่

ดังนั้นดูเหมือนว่าจะเข้าสู่เซิร์ฟเวอร์ nginx ของฉันและส่งคืนการเปลี่ยนเส้นทาง 301 แต่อยู่ภายใต้โฟลเดอร์ที่มีโฟลเดอร์ /project/folder/ ภายในซึ่งถูกต้องสำหรับเซิร์ฟเวอร์นั้น แต่จะไม่ถูกต้องเมื่อเผยแพร่ไปยังเซิร์ฟเวอร์โฮสต์ซึ่งควรจะเป็น server.com/test/folder/ และไม่ server.com/project/folder/.

Ivan Shatsky avatar
gr flag
ฉันไม่เห็นสิ่งใดในการกำหนดค่าของคุณที่สามารถสร้างการเปลี่ยนเส้นทางแบบนั้นได้ คุณสามารถเรียกใช้ `curl -v https://server.com/test/folder` และเพิ่มผลลัพธ์ให้กับคำถามของคุณได้หรือไม่
yt flag
@IvanShatsky เพิ่งเพิ่มผลลัพธ์ `curl -v`
Ivan Shatsky avatar
gr flag
ฉันหายไปอย่างสมบูรณ์ ก่อนอื่น คุณบ่นว่า `https://server.com/test/folder` เปลี่ยนเส้นทางไปที่ `https://server.com/project/folder/` ต่อไป คุณแสดงคำขอที่ `https://server.com/project/folder` กำลังถูกเปลี่ยนเส้นทางไปยัง `https://server.com/project/folder/` (ซึ่งเป็นลักษณะการทำงานที่คาดไว้หากเป็น `/home/ .www/project/folder` เป็นไดเร็กทอรีที่มีอยู่ในระบบไฟล์ในเครื่องของคุณ คำถามของคุณคืออะไร
yt flag
@IvanShatsky ขออภัย ฉันแก้ไขการแก้ไข ฉันขอไปที่ `https://server.com/test/folder` และมันเปลี่ยนเส้นทางไปที่ `https://server.com/project/folder/` ฉันไม่ได้ทำผิดในคำขอ curl เมื่อฉันพิมพ์คำตอบให้คุณ
yt flag
@IvanShatsky ความคิดใด ๆ ที่จะได้รับการชื่นชม ขอบคุณ
Richard Smith avatar
jp flag
วิธีแก้ปัญหาที่ง่ายที่สุดที่เราใช้ `test` แทน `project` ในการกำหนดค่า Nginx ของคุณ เพื่อให้ gcloud ชี้ `/test` เป็น `/test`

โพสต์คำตอบ

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