เปลี่ยนเส้นทางโดเมนย่อยไวด์การ์ดไปยัง https (nginx)


20

ฉันได้รับการรับรอง wildcard ssl และฉันพยายามเปลี่ยนเส้นทางการรับส่งข้อมูลที่ไม่ใช่ ssl ไปยัง ssl ขณะนี้ฉันกำลังใช้สิ่งต่อไปนี้สำหรับการเปลี่ยนเส้นทาง url ที่ไม่ใช่โดเมนย่อยซึ่งทำงานได้ดี

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

เมื่อฉันทำสิ่งเดียวกันกับ * .mydomain.com มันจะเปลี่ยนเส้นทางไปทางตรรกะ

https://%2A.mydomain.com/

คุณเปลี่ยนเส้นทางโดเมนย่อยทั้งหมดให้เทียบเท่ากับ https ได้อย่างไร


2
แทนที่จะเป็น $ server_name ทำไมไม่ใช่ $ host
cjc

คำตอบ:


47

นั่นคือทั้งหมด ...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}

2
คำอธิบายเพิ่มเติมเล็กน้อยอาจทำให้คำตอบนี้ดีขึ้น
Dave M

3
@ เดฟ -m จำเป็นต้องอธิบายไหม? $hostตัวแปร? $request_uri?
cadmi

มันใช้งานไม่ได้ แต่ยังได้รับ https: //%2A.handy.travel/
Damon Yuan

2

เอกสารอย่างเป็นทางการของ NGINX สนับสนุนให้ใช้คำสั่งส่งคืนแทนที่จะใช้คำสั่งเขียนซ้ำสำหรับการเปลี่ยนเส้นทางที่มีผล นี่เป็นเช่นนั้นเนื่องจากคำขอที่เขียนใหม่ไม่ได้มีไว้สำหรับเซิร์ฟเวอร์นั้น แต่ก็ยังได้รับการประมวลผลในบล็อกเซิร์ฟเวอร์นั้น ดังนั้นการเปลี่ยนเส้นทางจะทำได้อย่างถูกต้องด้วยคำสั่งส่งคืนแทนเนื่องจากการประมวลผลทั้งหมดจะหยุดและการตอบสนองจะถูกส่งทันที NGINX ไม่อนุญาตให้เขียนซ้ำสำหรับการเปลี่ยนเส้นทางที่นี่: http://nginx.org/en/docs/http/converting_rewrite_rules.html

ไวยากรณ์สำหรับ directive return คือ: return code URL; เนื่องจากคุณทำการเขียนใหม่อย่างถาวรดังนั้นคุณจึงสามารถใช้ 301 เป็นรหัสเพื่อตอบกลับโดยระบุว่าเป็นการเปลี่ยนเส้นทางถาวร ที่อยู่ https ของคุณจะถูกส่งผ่านในส่วน url การอ้างอิง: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

ดังนั้นการกำหนดค่าที่ถูกต้องของคุณจะเป็น

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

สิ่งนี้อาจช่วยให้คุณเปลี่ยนเส้นทางไปยังโดเมน ssl ของคุณได้อย่างถูกต้องพร้อมกับบล็อกเซิร์ฟเวอร์ไวด์การ์ด นอกจากนี้คุณยังสามารถลองใช้ชื่อเซิร์ฟเวอร์ทั่วไป '_' หรือ $ host ตามที่แนะนำในความคิดเห็นด้านบน แจ้งให้เราทราบ!


แม้ว่าการใช้returnโดยทั่วไปจะดีกว่า แต่การกำหนดค่าที่แนะนำไม่ถูกต้องเนื่องจากยังคงใช้ $ server_name สำหรับการเปลี่ยนเส้นทางซึ่งจะเป็น "* .mydomain.com" การแก้ไขที่ถูกต้องถูกระบุไว้แล้วโดย @cjc ในความคิดเห็นดังกล่าวข้างต้น - ควรจะนำมาใช้แทน$host $server_name
Maxim Dounin

ใช่เห็นด้วย อาดูเหมือนว่าความสนใจของฉันจะอยู่ในช่วง fadin '!
Apurva Sukant

นอกเหนือจากการเพิกถอนข้างต้นอนุญาตให้ฉันให้คำแนะนำกับการกำหนดค่า ssl ของคุณซึ่งควรปรับปรุงประสิทธิภาพอย่างมาก วิธีที่มีประสิทธิภาพที่สุดในการตั้งค่า SSL หากคุณใช้ใบรับรองไวด์การ์ดคือการตั้งค่า 'การเย็บเล่ม SSL' ซึ่งช่วยให้คุณตั้งค่า SSL หนึ่งครั้งบนเซิร์ฟเวอร์เริ่มต้นของคุณสำหรับโดเมนย่อยทั้งหมดและบันทึกการรับรองความถูกต้อง SSL แยกต่างหากสำหรับแต่ละโดเมนย่อย ssl_stapling บน; ตัวแก้ไข 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify บน; Refference- calomel.org/nginx.html
Apurva Sukant

2
ควรเป็นreturn 301 https://$host$request_uri;
scarver2

ฉันกำลังฟังพอร์ต 80, 8080 และ 8181 return 301 https://$server_name$request_uri;เพื่อให้พวกเขาใช้ https บนพอร์ต 443 ปัญหาคือ URL ที่เปลี่ยนเส้นทางยังคงมีหมายเลขพอร์ตเดิม 80 ไม่ใช่ปัญหา แต่ 8080 ออกมาเป็นhttps://example.com:8080
A.Grandt

-1

ลองสิ่งนี้:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

catch คือการกำหนดเซิร์ฟเวอร์ไวด์การ์ดและทำการเปลี่ยนเส้นทางตามชื่อของมัน


กลุ่ม regex อนุญาตมากเกินไป
Kzqai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.