เปลี่ยนเส้นทาง URL ภายใน Apache VirtualHost


61

ฉันมีเซิร์ฟเวอร์เฉพาะที่มี Apache ซึ่งฉันได้ตั้งค่า VirtualHosts บางตัว ฉันได้ตั้งค่าหนึ่งเพื่อจัดการโดเมน www รวมถึงโดเมนที่ไม่ใช่ www

ไฟล์ VH .conf ของฉันสำหรับ www:

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

ด้วยสิ่งนี้.htaccess:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

มีวิธีง่ายๆในการเปลี่ยนเส้นทาง www ไปเป็นรุ่นที่ไม่ใช่ www หรือไม่? ขณะนี้ฉันกำลังส่งทั้งสองเวอร์ชันให้เหมือนกันDocumentRootและใช้งานอยู่.htaccessแต่ฉันแน่ใจว่าฉันต้องสามารถทำได้ในไฟล์ VirtualHost


คำตอบ:


105

เปิดออกmod_rewriteกฎจะดีในไฟล์ VirtualHosts นอกเหนือจากRewriteBaseกฎ ฉันลงเอยด้วยสิ่งนี้:

<VirtualHost *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

แก้ไข: ตามคำแนะนำของ joschi ในความคิดเห็นตอนนี้ฉันกำลังใช้เวอร์ชันที่ง่ายนี้โดยใช้Redirectคำสั่งจากmod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

2
คุณไม่ต้องการ mod_rewrite สำหรับสิ่งนี้ ใช้ mod_alias และคำสั่ง RedirectPermanent แทน
joschi

@ โจชิ: อะไรคือข้อดีของมัน? เร็วขึ้นไหม
DisgruntledGoat

12
คุณไม่ต้องการเอ็นจิ้นการเขียนใหม่ที่มีการตรวจสอบและความเป็นไปได้ทั้งหมดเพียงแค่เปลี่ยนเส้นทางไคลเอ็นต์ มันจะเร็วขึ้น (เล็กน้อย) เนื่องจาก mod_alias ไม่ใกล้เคียงกับความซับซ้อนเท่า mod_rewrite และคุณต้องการเพียงหนึ่ง directive (RedirectPermanent) แทนที่จะเป็นสองกับ mod_rewrite และสุดท้าย แต่ไม่ท้ายสุด IMHO ง่ายกว่าที่จะเข้าใจว่าเกิดอะไรขึ้นในการกำหนดค่าเมื่อมีคนดูครั้งแรก
joschi

1
ด้วยเหตุผลแปลก ๆ บางอย่าง Redirect 301 .. ไม่ได้ผลสำหรับเรา เราต้องใช้ตัวเลือก RewriteRule
so_mv

หมายเหตุ: การใช้ PHP 5.3.0 บน WAMPSERVER 2.0 บน Windows Server 2008 R2 Enterprise ไม่รวม:80หลังจากVirtualHost *ทำให้ทุกอย่างกลับมา "ต้องห้าม"!
Cees Timmerman

4

โปรดใช้ความระมัดระวังเป็นอย่างยิ่งกับการเปลี่ยนเส้นทาง 301 เพราะตามค่าเริ่มต้นเบราว์เซอร์ที่ได้รับ 301 เปลี่ยนเส้นทางจะเก็บไว้อย่างถาวร - www.example.comหมายความว่าคุณจะให้ขึ้นการควบคุมสิ่งที่เบราว์เซอร์ที่จะเห็นเมื่อพยายามเข้าถึงโดเมน

ดูตัวอย่างการสนทนานี้http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

ดังนั้นตรวจสอบให้แน่ใจว่าไม่ได้รับแคชหรือใช้ mod_proxy (ฉันแนะนำ mod_proxy)

หากคุณไม่ต้องการให้ผู้ใช้เห็นการเปลี่ยนแปลง URL บนแถบที่อยู่ของเบราว์เซอร์ให้ใช้ mod_rewrite:

<VirtualHost *>
 ServerName www.example.com
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^www.example.com
 RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
 Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
 Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>

หากคุณต้องการให้ผู้ใช้มองไม่เห็น "การเปลี่ยนเส้นทาง" ให้ใช้ mod_proxy:

<VirtualHost *>
 ServerName www.example.com
 ProxyRequests Off
 <Proxy *>
 Order Deny,Allow
 Deny from all
 Allow from 203.0.113.67
 </Proxy>
 ProxyPass / http://example.com/
 ProxyPassReverse / http://example.com/
</VirtualHost>

ควรสังเกตว่า mod_proxy เมื่อกำหนดค่าไม่ดีสามารถเป็นอันตรายต่อเครือข่ายของคุณ


5
ประเด็นของ 301 คือมันเป็นการเปลี่ยนเส้นทางแบบถาวร หากคุณต้องการเปลี่ยนเส้นทางที่ไม่ถาวรคุณควรใช้ 302 หรือ 307 แทน
nickgrim

2

คุณสามารถเพิ่มServerAlias example.comในVirtualHostแต่ประสิทธิภาพจะแตกต่างจากการเปลี่ยนเส้นทาง

แก้ไข

เนื่องจากคุณต้องการเปลี่ยนเส้นทางและคุณไม่ต้องการฟังก์ชั่นขั้นสูงดูเหมือนว่าการใช้น่าRedirectจะเพียงพอสำหรับคุณแล้ว คุณจะวางRedirectภายใต้คำสั่ง VirtualHost

โซลูชันฝั่งไคลเอ็นต์จะใช้meta refreshแท็ก


คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม? ฉันจะเปลี่ยนเส้นทางwww.example.comไปexample.comใช้วิธีนี้ได้อย่างไร
DisgruntledGoat

ใน vhost หลักของคุณคุณมีรายการสำหรับทั้งสองและServerName ServerAliasหนึ่งมี example.com และอีก www.example.com จากนั้นทั้งสองรายการ dns จะเข้าถึงเอกสารที่ระบุใน vhost เดียวกัน
วอร์เนอร์

ฉันต้องการเปลี่ยนเส้นทางแต่ไม่ใช่เพียงนามแฝง
DisgruntledGoat

จากนั้นคำแนะนำของ joshchi อาจเป็นวิธีที่ดีสำหรับคุณ ดูเหมือนว่าขนจะถูกแบ่ง ณ จุดนี้
Warner

1

คุณสามารถสร้างโฮสต์เสมือนหนึ่งรายการสำหรับ SERVERNAME www.example.com และให้มันเปลี่ยนเส้นทางไปยังโฮสต์เสมือนอื่นด้วยชื่อเซิร์ฟเวอร์ example.com

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