ฉันมีการตั้งค่าเซิร์ฟเวอร์ 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/
.