Score:1

เปลี่ยนเส้นทางโดเมนย่อย Apache ไปยังโดเมนย่อยอื่นแล้ว

ธง fr

ฉันกำลังพยายามตั้งค่าโดเมนย่อยสองโดเมนสำหรับ และ ใน โดเมน.คอม. ฉันใช้ไฟล์ .conf สองไฟล์ ซึ่งมีลักษณะค่อนข้างเหมือนกันตามการเปลี่ยนแปลงของ ServerName และ ProxyPass:

<VirtualHost *:80>
        ServerName a.domain.com #This was added as a try for a fix. 
        Redirect permanent /  https://a.domain.com/
</VirtualHost>

<VirtualHost *:443>

        ServerName a.domain.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/a

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSL stuff

        #Proxies

        ProxyPass        /        https://a.domain.com:8444/
        ProxyPassReverse /        https://a.domain.com:8444/
        ProxyPass        /a/      https://a.domain.com:8444/
        ProxyPassReverse /a/      https://a.domain.com:8444/
        ProxyPass        /b/      https://b.domain.com:8445/
        ProxyPassReverse /b/      https://b.domain.com:8445/

</VirtualHost>

สิ่งนี้กำลังดำเนินการในสภาพแวดล้อมการทดสอบของฉัน โดยจำลองสิ่งที่คล้ายกับสิ่งที่กำลังผลิตอยู่ ใน /etc/hosts ฉันเพิ่ม a.domain.com และ b.domain.com เป็น 127.0.0.1 DNS ในการผลิตมีบันทึกสำหรับอะไร a.domain.com และ b.domain.com ซึ่งเป็น IP เดียวกัน (ฉันทำสิ่งนี้ในเครื่องที่ฉันกำลังทดสอบด้วย)

โปรดทราบว่าฉันไม่ได้ให้บริการเนื้อหาใด ๆ จากไดเร็กทอรีรูทของพวกเขา ฉันเพิ่มที่พยายามแก้ไขปัญหาที่ระบุไว้ในชื่อเรื่อง มี html อย่างง่ายในทั้งสองไดเร็กทอรี

ปัญหาที่แท้จริงคืออะไร?

เพียงแค่เมื่อพยายาม a.domain.comผลลัพธ์คือเว็บแอปจาก localhost:8444, อย่างที่คาดไว้. เมื่อพยายาม b.domain.com, ผลลัพธ์ก็เช่นกัน localhost:8444, แทน localhost:8445. ทั้งคู่ ก.conf และ ข.conf เปิดใช้งานอยู่ และถ้าฉันปิดใช้งาน ก.confแล้วฉันถูกต้องได้รับ localhost:8445. ถ้าฉันยังลองเช่น a.domain.com/bการเปลี่ยนเส้นทางจะแก้ไขกลับไปที่ a.domain.com.

ฉันได้อ่านคำถามและบทช่วยสอนหลายข้อ และส่วนใหญ่มีบางอย่างที่ทำงานเหมือนกับการกำหนดค่าของฉัน หรือเพิ่ม NameVirtualHost ซึ่งฉันเข้าใจว่าไม่จำเป็นสำหรับ Apache เวอร์ชันของฉันฉันยังเพิ่มชื่อเซิร์ฟเวอร์ในพอร์ต 80 เพราะฉันคิดว่าอาจเป็นคำขอสำหรับ ถูกจับคู่โดย ก.conf เนื่องจากเป็น IP เดียวกัน แต่ก็ไม่ได้ผลเช่นกัน

ฉันพลาดอะไรไปที่นี่? มีบางอย่างกับ mod_proxy ที่ฉันดูเหมือนจะเพิกเฉยหรือไม่? ถ้าเป็นไปได้ ฉันต้องการเก็บหนึ่งไฟล์ต่อหนึ่งเว็บแอป ขอบคุณ!

ข้อมูลนี้อยู่ใน Ubuntu 18.04.2, Apache 2.4 (mod_proxy และ mod_ssl), Tomcat 9 หากต้องการข้อมูลอื่นๆ เราจะพยายามจัดส่งให้อย่างเต็มที่

อัปเดต

พยายามด้วยการกำหนดค่านี้ด้วย ผลลัพธ์ที่ไม่ต้องการเหมือนกัน

<VirtualHost *:80>
        ServerAlias a.domain.com
        Redirect permanent /  https://a.domain.com/
</VirtualHost>

<VirtualHost *:443>

        ServerName a.domain.com
        ServerAdmin webmaster@localhost

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSL stuff

        #Proxies

        Redirect /b https://b.domain.com

        <Location />
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

        <Location /a>
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

</VirtualHost>

อัปเดต

ตกลง ฉันเพิ่งพบบางสิ่งที่น่ารำคาญมาก ถ้าฉันเข้าด้วยเบราว์เซอร์ของฉันเพื่ออย่างใดอย่างหนึ่ง a.domain.com หรือ b.domain.comพวกเขาทั้งสองตั้งใจที่จะ a.domain.com. นั่นคือปัญหาที่ฉันอธิบายไว้ในตอนแรก แต่ถ้าลอง https://a.domain.com หรือ https://b.domain.comทั้งคู่แก้ไขไปยังเซิร์ฟเวอร์ที่ถูกต้อง: ถึง 8444 และ ถึง 8445.

เนื่องจากสิ่งนี้น่าผิดหวังมาก ฉันจะพักเบรคและวิเคราะห์สิ่งนี้สักครู่

อัปเดต

หลังจากพักเบรกไปนาน ฉันลองปรับแต่งแบบสุ่มอื่นๆ เพื่อดูว่าเกิดอะไรขึ้น แต่ก็ไม่มีอะไรทำงานตามที่คาดไว้ ยกเว้นเมื่อใช้ HTTPS ฉันติดตั้ง Postman เพื่อดูว่ามีการส่งอะไรในคำขอ และพบว่าใน Postman ทั้ง HTTP และ HTTPS ใช้ Host อย่างถูกต้อง ดียิ่งขึ้น/แย่ลง: การตอบกลับจริงแสดงหน้าต้อนรับที่แตกต่างกันสำหรับ a.domain.com และ b.domain.comหมายความว่าการกำหนดค่าของฉันทำงานได้อย่างถูกต้อง เมื่อฉันใช้บุรุษไปรษณีย์

ฉันคิดว่าการทดสอบทั้งหมดนี้อาจเป็นแค่ปัญหาแคช แต่เบราว์เซอร์ทดสอบที่ฉันเลือก (Firefox dev ed) ถูกตั้งค่าไม่ให้แคชข้อมูล ฉันจะตรวจสอบการตอบกลับด้วย curl และเบราว์เซอร์อื่นๆ ของฉัน

kz flag
คุณพูดถึง _caching_ ... โปรดทราบว่าคำสั่ง 301 ถูกแคชอย่างต่อเนื่อง (โดยเบราว์เซอร์และอาจเป็นแคชตัวกลาง) หากก่อนหน้านี้คุณละเว้นคำสั่ง `ServerName a.domain.com` ใน vHost:80 (และคำสั่งที่เกี่ยวข้องสำหรับ `b.domain.com`) การเปลี่ยนเส้นทางจาก `http://b.domain.com/` เป็น ` https://a.domain.com` อาจถูกแคชไว้ (ขึ้นอยู่กับลำดับที่รวมไฟล์ปรับแต่งของคุณ) ใช่แล้ว คำสั่งนั้นเป็น _essential_ จริงๆ
Jetto Martínez avatar
fr flag
ใช่ ความคิดเห็นของคุณมาในเวลาที่ฉันโพสต์คำตอบ มันคือแคชจริงๆ ฉันได้ตั้งค่าเบราว์เซอร์ไม่ให้แคชอะไรเลย แต่มันกำลังแคชอยู่ ฉันไม่แน่ใจว่าเหตุใดการกำหนดค่านี้จึงถูกรีเซ็ต ด้วยการแก้ไขนี้ฉันจะยังคงตรวจสอบสิ่งนี้ ขอบคุณ!
Score:1
ธง fr

ผู้ร้าย: แคช.

เมื่อถึงจุดหนึ่ง การกำหนดค่าเบราว์เซอร์ของฉันเปลี่ยนไป (อาจเป็นการอัปเดตหรือไม่) และฉันมีแคชมากกว่า 3GB รวมถึงไซต์ทดสอบที่ฉันพยายามตั้งค่าเป็นโดเมนย่อย ใช่

หลังจากล้างแคชแล้ว จะมีการแจ้งเตือนเกี่ยวกับใบรับรองที่ลงนามเองเมื่อกดที่ URL ตามที่คาดไว้ หลังจากยอมรับความเสี่ยง ฉันถูกเปลี่ยนเส้นทางไปยังไซต์ที่เหมาะสม นี้โดยใช้ b.domain.com โดยไม่ต้องเพิ่มโปรโตคอล

เพื่อให้แน่ใจว่ามันใช้งานได้ ฉันทดสอบในเบราว์เซอร์อื่นๆ ทั้งหมด 7 ตัวของฉัน (ต้องทำให้แน่ใจว่า) และทำการ curl โดยมีหรือไม่มีโปรโตคอล และผลลัพธ์ก็เป็นตามที่ต้องการเช่นกัน

ในที่สุดการกำหนดค่าก็โอเค ฉันจะโพสต์ที่นี่ในกรณีที่คุณต้องการ เซิร์ฟเวอร์ Apache พร็อกซีไปยังอินสแตนซ์ Tomcat เฉพาะตามโดเมนย่อย โดยใช้ proxy_mod ที่เปลี่ยนเส้นทางทันทีจากพอร์ต 80 ไปยังพอร์ต 433.

<VirtualHost *:80>
        ServerName a.domain.com
        Redirect permanent /  https://a.domain.com/
</VirtualHost>

<VirtualHost *:443>
        
        ServerName a.domain.com
        ServerAdmin [email protected]

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSL stuff

        SSLEngine On
        SSLCertificateFile /etc/ssl/certs/DONT_USE_SELF_SIGNED.pem
        SSLCertificateKeyFile /etc/ssl/private/CERTS_IN_PRODUCTIve.key
        SSLVerifyClient none

        #Proxies
        ProxyRequests Off
        SSLProxyEngine on
        SSLProxyVerify none
        SSLProxyCheckPeerCN off
        SSLProxyCheckPeerName off
        SSLProxyCheckPeerExpire off

        #Redirections
        Redirect /b https://b.domain.com

        <Location />
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

        <Location /a>
                ProxyPass               https://localhost:8444/
                ProxyPassReverse        https://localhost:8444/
        </Location>

</VirtualHost>

โปรดพิจารณาว่าการตั้งค่าสำหรับ SSL Proxy และ SSL นั้นใช้สำหรับใบรับรองที่ลงนามด้วยตนเอง โปรดอ่านเอกสารประกอบที่เกี่ยวข้องสำหรับแต่ละเอกสาร หากคุณนำสิ่งนี้ไปใช้ในสภาพแวดล้อมที่มีประสิทธิผลโปรดทราบว่านี่เป็นไฟล์กำหนดค่าสำหรับ a.domain.com. เทียบเท่ากับ b.domain.com เหมือนกันทุกประการกับ ServerName, ServerAlias, redirects, Location และพอร์ตของ localhost ที่เหมาะสม

kz flag
จุดเล็กน้อย แต่คุณไม่จำเป็นต้องใช้ `ServerName` _and_ `ServerAlias` หากพวกเขาอ้างถึง _hostname_ เดียวกัน
Jetto Martínez avatar
fr flag
ข้อสังเกต. ชื่อเซิร์ฟเวอร์คือชื่อที่ฉันควรเก็บไว้ใช่ไหม
kz flag
ใช่ถูกแล้ว.

โพสต์คำตอบ

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