Score:0

การเปลี่ยนเส้นทางแบบมีเงื่อนไขหลายรายการทั้งหมดใน .htaccess เดียว (Landing Page)

ธง gb

ฉันมีโฟลเดอร์ที่มี html หน้าเดียว "Coming Soon"

จากนั้นฉันมีหลายโดเมนที่ฉันชี้ไปที่โฟลเดอร์นี้เป็นครั้งคราวตามต้องการ

ง่ายใช่มั้ย

สิ่งที่ฉันต้องการคือเงื่อนไขว่าถ้าหน้าที่ขอเดิมไม่ใช่ www ให้ไปที่ www (301> PLUS ถ้าไม่ใช่ https ให้ไปที่ https (301) จากนั้นเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดไปที่ https://www.originating-domain.xzy/index.html (302)

จุดประสงค์คือเพื่อให้เป็นหน้า Landing Page สำหรับการใช้งานหลายวัตถุประสงค์ แต่เสมอ 301 ถึง https://www แล้ว 302 ถึง index.html

ฉันมี non-www ถึง www และ http ถึง https ที่ทำงานในแต่ละไซต์แล้ว:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond ลด %{HTTPS}
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

ตอนนี้ฉันต้องการเพิ่มการเปลี่ยนเส้นทาง 302 temp ไปที่ index.html.

หรือมีวิธีที่ดีกว่าในการทำเช่นนี้อย่างสมบูรณ์? เช่นเนื่องจากทั้งหมดนี้เป็นเพียงชั่วคราว ... 302 การรับส่งข้อมูลทั้งหมดไปยังดัชนี ฉันลองสิ่งนี้ แต่ไม่ได้ผล

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
kz flag
คุณต้องการ URL ใด ๆ เช่น `https://www.example.com/whatever` เพื่อแสดงหน้า "เร็วๆ นี้" หรือเพียงแค่ _homepage_ (เช่น URL รูท)
gb flag
ใช่. อะไรก็ตามที่เป็น example.xyz/wheight เพื่อเปลี่ยนเส้นทางไปที่ https://www. example.xyz/index.html ไม่ใช่ www และไม่ใช่ https (301) แต่ฉันต้องการเก็บตัวอย่างเดิมไว้ xyz เพียงแค่ลบ / อะไรก็ตามที่เป็น (302) ฉันไม่แน่ใจว่าฉันอธิบายถูกไหม
Score:0
ธง gb

ตกลงมันใช้งานได้ตามที่ฉันต้องการ แต่ฉันสามารถรวมเข้าด้วยกันได้หรือไม่?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond ลด %{HTTPS}
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
kz flag
ฉันได้อัปเดตคำตอบเพื่อแก้ไขปัญหานี้แล้ว
kz flag
โปรดพิจารณา "ยอมรับ" คำตอบของฉัน (เพื่อช่วยผู้อ่านคนอื่นๆ และนำคำถามออกจากคิวคำถามที่ยังไม่มีคำตอบ) และโหวตขึ้นหากคุณพบว่ามีประโยชน์ ขอบคุณ ชื่นชมมาก :)
Score:0
ธง kz
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

มีปัญหาสองสามข้อเกี่ยวกับเรื่องนี้...

  1. ดูเหมือนว่าคุณจะขาด เขียนกฎใหม่ ลวดลาย (อาร์กิวเมนต์แรก) อย่างสมบูรณ์ ดังนั้นคำสั่งนี้จะล้มเหลวในการจับคู่

  2. หากสิ่งนี้ตรงกันก็จะขึ้นต้นด้วย www. โดเมนย่อย อีกครั้ง. ฉันถือว่าคุณกำลังใส่การเปลี่ยนเส้นทางนี้ หลังจาก การเปลี่ยนเส้นทางตามรูปแบบบัญญัติ (HTTP เป็น HTTPS และไม่ใช่ www ไปยัง www) อย่างที่ควรจะเป็น ดังนั้นสิ่งนี้จะเปลี่ยนเส้นทางไปที่ https://www.www.example.com/index.htmlเนื่องจากเมื่อมีการทริกเกอร์การเปลี่ยนเส้นทางนี้ ชื่อโฮสต์จะเป็นที่ยอมรับอยู่แล้ว

เดอะ เงื่อนไข (เขียนซ้ำ คำสั่ง) ไม่จำเป็นจริงๆ เนื่องจากการตรวจสอบนี้ (ที่ /index.html ยังไม่ได้ร้องขอ) สามารถจัดการได้อย่างมีประสิทธิภาพมากขึ้นโดย เขียนกฎใหม่ คำสั่งนั้นเอง

ตัวอย่างเช่น:

RewriteRule !^index\.html$ /index.html [R=302,L]

ไม่จำเป็นต้องรวมโครงร่าง+ชื่อโฮสต์ใน การแทน สตริงเนื่องจากคุณต้องการเปลี่ยนเส้นทางไปยังสิ่งเดียวกันอยู่ดี หากคุณต้องการให้ชัดเจน คุณสามารถเขียน https://%{HTTP_HOST}/index.html.

โปรดทราบว่าตามที่มันยืน index.html ไม่สามารถอ้างอิงอื่นใดได้ ท้องถิ่น ทรัพยากร (รูปภาพ, CSS, JavaScript ฯลฯ) เนื่องจากคำขอเหล่านี้จะถูกเปลี่ยนเส้นทางด้วย ในการอนุญาตให้เข้าถึงทรัพยากรในเครื่อง คุณจะต้องเพิ่มเงื่อนไขสองสามข้อเพื่อยกเว้นคำขอทรัพยากรแบบคงที่

RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]

หรือโฮสต์ทรัพยากรเหล่านี้บนโดเมนภายนอก (หรือในไดเร็กทอรีย่อยและไม่รวมไดเร็กทอรีย่อยทั้งหมด)

อย่างไรก็ตาม หากเลือก "เปลี่ยนเส้นทาง" เลย ฉันอาจเปลี่ยนเส้นทางไปยังไฟล์ที่มีชื่อเฉพาะ/มีความหมายมากกว่า เช่น /coming-soon.html. ปัญหาการใช้งาน /index.html คือถ้าคุณต้องการแสดงเนื้อหาอื่นใน URL นั้นในภายหลัง และถูกแคชไว้ (ไม่ว่าด้วยเหตุผลใดก็ตาม) แม้ว่า /coming-soon.html น่าจะเป็น "noindex"

อย่างไรก็ตาม อาจเป็นการดีกว่าที่จะไม่เปลี่ยนเส้นทางเลยและให้บริการ ก ชั่วคราว การตอบสนอง "503 บริการไม่พร้อมใช้งาน" ดู คำตอบของฉัน สำหรับคำถามต่อไปนี้ใน Webmasters stack สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้:


นอกเหนือ:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond ลด %{HTTPS}
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

คุณอยู่เบื้องหลังพร็อกซีฟรอนต์เอนด์ที่จัดการการเชื่อมต่อ SSL หรือไม่

หากคุณเป็นเช่นนั้นก็ไม่เป็นไร แม้ว่าเงื่อนไขที่สองจะตรวจสอบ HTTPS ตัวแปรเซิร์ฟเวอร์จึงไม่จำเป็น แต่ถ้าคุณเป็น ไม่ หลังพร็อกซี SSL คำสั่งเหล่านี้มีความเสี่ยงที่จะถูกหลีกเลี่ยง (เช่น ผู้ใช้ไม่ได้ถูกเปลี่ยนเส้นทางไปยัง HTTPS) หาก X-ส่งต่อโปรโต: https ส่วนหัวถูกฉีดเข้าไปในคำขอ


อัปเดต:

ตกลงมันใช้งานได้ตามที่ฉันต้องการ แต่ฉันสามารถรวมเข้าด้วยกันได้หรือไม่?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond ลด %{HTTPS}
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]

ดังที่กล่าวไว้ข้างต้น โดยพื้นฐานแล้วกฎข้อสุดท้ายจะเหมือนกับกฎต่อไปนี้ (เมื่อใช้ร่วมกับการเปลี่ยนเส้นทางตามรูปแบบบัญญัติก่อนหน้า) ซึ่งง่ายกว่าและมีประสิทธิภาพมากกว่า:

RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]

ในกฎข้อที่สอง คุณควรเปลี่ยน เขียนกฎใหม่ ลวดลาย จาก ^(.*)$ ถึง ^ (เช่นเดียวกับกฎข้อแรก) ^(.*)$ จับการอ้างอิงย้อนกลับโดยไม่จำเป็นและมีประสิทธิภาพน้อยลง

คุณได้กล่าวถึงในความคิดเห็นก่อนหน้า (ตอนนี้ถูกลบไปแล้ว) ว่าคุณต้องการให้สิ่งนี้ใช้ได้กับโดเมนย่อยใดๆ ด้วย มัน "ใช้งานได้" สำหรับโดเมนย่อยใดๆ อย่างไรก็ตาม มันจะเพิ่มส่วนเพิ่มเติมเสมอ www โดเมนย่อยซึ่งอาจเป็นที่ต้องการหรือไม่ก็ได้ (ไม่ธรรมดาที่จะมี www โดเมนย่อยบน โดเมนย่อย. วายเอ็มเอ็มวี.)

ไม่จำเป็นต้อง "รวม" กฎเหล่านี้เข้าด้วยกัน คุณไม่สามารถรวมเข้าด้วยกันได้หากคุณต้องการให้ 301 เปลี่ยนเส้นทางไปที่ www+HTTPS ก่อนที่ 302 จะเปลี่ยนเส้นทางไปยังหน้า "เร็ว ๆ นี้" แม้ว่ากฎสองข้อแรก (การเปลี่ยนเส้นทาง 301 รายการ) สามารถ "รวมกัน" เป็นกฎข้อเดียวได้ กฎนี้ไม่มีประโยชน์ใดๆ

ปัญหาเล็กน้อยเพียงอย่างเดียวที่นี่คืออาจมีการเปลี่ยนเส้นทาง (สูงสุด) 2 ครั้ง อันดับแรก 301 ถึง www+HTTPS บนเส้นทาง URL ดั้งเดิม และ 302 ที่สองไปที่หน้า "เร็ว ๆ นี้"

ฉันจะถามว่าคุณต้องการเปลี่ยนเส้นทาง 301 เริ่มต้นไปที่ www+HTTPS หรือไม่ เมื่อคุณเปลี่ยนเส้นทางผู้ใช้ไปยัง ชั่วคราว หน้า "เร็ว ๆ นี้"เมื่อคุณติดตั้งไซต์ใหม่แล้ว (แทนที่หน้า "เร็ว ๆ นี้") คุณจะใช้การเปลี่ยนเส้นทางตามรูปแบบบัญญัติ การเปลี่ยนเส้นทาง 302 ยังคงสามารถเปลี่ยนเส้นทางไปที่ www+HTTPS (อย่างไรก็ตาม มีกรณีขอบเมื่อ /coming-soon.html โดยตรง)

ตัวอย่างเช่น:

# 302 เปลี่ยนเส้นทางไปยังหน้าเร็ว ๆ นี้ (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]

#เคสขอบ...
# กฎสองข้อต่อไปนี้ใช้เฉพาะเมื่อมีการร้องขอ "/coming-soon.html" โดยตรงเท่านั้น
# และขอชื่อโฮสต์ที่ไม่ใช่ www และ/หรือ HTTP อย่างใดอย่างหนึ่ง
# ซึ่งในกรณีนี้ 301 เปลี่ยนเส้นทางไปที่ www+HTTPS

# โดเมนย่อย www หายไป...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# มีการร้องขอ HTTP + www
RewriteCond ลด %{HTTPS}
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

คำขอใด ๆ สำหรับ http://example.com/foo คือ 302 เปลี่ยนเส้นทางตรงไปที่ https://www.example.com/coming-soon.html.

ถ้า http://example.com/coming-soon.html ควรได้รับการร้องขอจากนั้นจึงเปลี่ยนเส้นทาง 301 ไปที่ https://www.example.com/coming-soon.html (เพียงแค่แก้ไขโดเมนย่อย HTTPS และ www)

มีการเปลี่ยนเส้นทางภายนอกไม่เกิน 1 รายการเท่านั้น

โพสต์คำตอบ

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