Apache Default / Catch-All โฮสต์เสมือนจริงหรือ


67

หากฉันมี 3 โดเมน domain1.com, domain2.com และ domain3.com เป็นไปได้หรือไม่ที่จะตั้งค่าโฮสต์เสมือนเริ่มต้นสำหรับโดเมนที่ไม่อยู่ในรายการ ตัวอย่างเช่นถ้าฉันจะมี:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

หากคุณลงทะเบียนโดเมนและชี้ไปที่เซิร์ฟเวอร์ของฉันมันจะเป็นค่าเริ่มต้นทุกอย่างที่แสดงเช่นเดียวกับ domain3 เป็นไปได้ไหม

คำตอบ:


45

ใช่นั่นควรใช้งานได้ยกเว้น ServerAlias ​​ควรเป็น "*" โดยให้ ServerName ตั้งค่าเป็นชื่อโฮสต์จริง คุณอาจต้องตรวจสอบให้แน่ใจว่า VirtualHost เป็นไฟล์ที่โหลดล่าสุด ...


ควรใช้งานได้ แต่ไม่ได้ หากโดเมนไม่ได้อยู่ในรายการโดยเฉพาะฉันจะได้รับ "Firefox ไม่พบเซิร์ฟเวอร์"
SJaguar13

2
คุณตั้งเป็น "ServerName host" และ "ServerAlias ​​*" หรือไม่ ฉันไม่ได้เน้นเรื่องนี้มากพอในตอนแรก แต่ ServerName ไม่ได้ใช้สัญลักษณ์แทนมีเพียง ServerAlias ​​เท่านั้น ServerName ต้องเป็นชื่อโฮสต์จริง
Freiheit

virtualhost อื่น ๆ ใช้งานได้ด้วยหรือไม่ Apache รุ่นใด
Freiheit

"Firefox หาเซิร์ฟเวอร์ไม่พบ" ไม่ใช่ปัญหาของอาปาเช่ คุณต้องการรายละเอียดเพิ่มเติม (เซิร์ฟเวอร์ใดหากมีการติดต่ออะไรคือรหัสข้อผิดพลาด ... )
Law29

แปลกที่ไม่ได้ผลสำหรับฉันมันเลือก virtualhost ตัวแรกเสมอโดยไม่คำนึงถึงส่วนหัวของโฮสต์
jjxtra

80

เมื่อใช้โฮสต์เสมือนตามชื่อการกำหนดค่าโฮสต์เสมือนแรกที่โหลดจะเป็นค่าเริ่มต้น (ที่มา: Apache Wiki ) ตัวอย่างเช่นด้วยการกำหนดค่าด้านล่างมิฉะนั้นโดเมนที่ไม่ตรงกันจะจับคู่กับdomain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

เซิร์ฟเวอร์จำนวนมากไม่มีไฟล์กำหนดค่าแบบเสาหิน แต่มีไฟล์กำหนดค่าเฉพาะสำหรับโฮสต์หลายไฟล์ดังนี้:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

ในกรณีนี้จะทำให้ภาระการกำหนดค่าโฮสต์เสมือนโดยเฉพาะอย่างยิ่งครั้งแรกที่เปลี่ยนชื่อ symlink 00-defaultเพื่อบางสิ่งบางอย่างซึ่งจะเป็นครั้งแรกเมื่อเรียงเช่น


คำตอบอื่น ๆ บางคำไม่ถูกต้องนัก ตาม Apache Wiki การตั้งค่า a ServerNameในโฮสต์เสมือนไม่ถูกต้อง หากโฮสต์ที่ไม่มี a ServerNameไม่ถูกโหลดขึ้นมาก่อน Apache อาจไม่สามารถใช้งานได้เลยเพราะโฮสต์แรกที่โหลดจะเป็นค่าเริ่มต้น

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


+ 1 ล้าน internets ให้คุณครับ! มันจะต้องเป็นคนแรกที่จะเริ่มต้น
Ryan

คุณรู้หรือไม่ว่าอันไหนมาก่อน httpd.conf หรือ conf.d / xyz.conf
Esa Varemo

2
"การกำหนดค่าโฮสต์เสมือนแรกที่โหลดจะเป็นค่าเริ่มต้น" แก้ไขปัญหาของฉันกับโดเมน SSL ในเครื่องบน XAMPP (Windows) ดูเหมือนว่า Apache ใช้ vhost แรกเป็นค่าเริ่มต้นสำหรับแต่ละพอร์ตดังนั้นเพื่อจัดการโดเมนที่ไม่ได้จับคู่อย่างเหมาะสมสำหรับคำขอที่ไม่ปลอดภัย / ปลอดภัยทั้งสองควรมีการกำหนดค่าเริ่มต้น "ชัดเจน" 2 พอร์ตสำหรับพอร์ต 80/443 ที่จุดเริ่มต้นของhttpd-vhosts.conf
Wirone

1
@EsaVaremo - httpd.conf จะถูกโหลดก่อนและจะมีบรรทัดรวมที่แหล่งที่มา conf.d / xyz.conf (หรือน่าจะเป็น conf.d / *) การตั้งค่าใด ๆ (รวมถึง vhosts) ก่อนบรรทัดรวมจะถูกประมวลผลก่อน สิ่งใดหลังจากบรรทัดรวมจะถูกประมวลผลหลังจากไฟล์ที่รวมอยู่
Dan Pritts

7

อย่าระบุชื่อเซิร์ฟเวอร์และนั่นจะกลายเป็นค่าเริ่มต้นของคุณ

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

ตรวจสอบให้แน่ใจด้วยว่าคุณไม่ได้ระบุ DocumentRoot ในไฟล์ httpd.conf หลักเนื่องจากจะมีความสำคัญมากกว่า vhosts


ฉันมีสิ่งนั้นในฐานะโฮสต์เสมือนแรกที่ระบุไว้และฉันยังได้รับ "Firefox ไม่พบเซิร์ฟเวอร์"
SJaguar13

2
ฉันไม่เห็นด้วย. ฉันมีโฮสต์เสมือนชุดแรกที่ไม่มีชื่อเซิร์ฟเวอร์ แต่ดูเหมือนว่าจะขัดแย้งกับโฮสต์เสมือนบางตัว แต่ไม่ใช่โฮสต์อื่น ฉันแก้ไขปัญหาด้วยการเพิ่ม ServerName แต่ตั้งค่าเป็นโดเมนสุ่มบางรายการที่ไม่ได้อยู่บนเซิร์ฟเวอร์ของฉัน เนื่องจากเป็นโฮสต์เสมือนแรกจึงใช้เป็นค่าเริ่มต้น แต่จะจับคู่ก็ต่อเมื่อมีการใช้โดเมนที่ไม่ตรงกับ ServerName อื่น
joshaidan

3

การสั่งซื้อเป็นสิ่งสำคัญ - ย้ายคำจำกัดความ vhost ของคุณสำหรับทุกอย่างอื่นไปยังส่วนหัวของรายการ


2

ใช้โฮสต์เสมือน _default_ และวางไว้ก่อนใน httpd-vhosts.conf ตามที่ระบุในhttp://httpd.apache.org/docs/2.2/vhosts/examples.html

"การจับทุกคำขอไปยังที่อยู่ IP และพอร์ตที่ไม่ได้รับการระบุนั่นคือการรวมที่อยู่ / พอร์ตที่ไม่ได้ใช้สำหรับโฮสต์เสมือนอื่น ๆ [... ] vhost เริ่มต้นจะไม่ตอบสนองคำขอที่ส่งไปยังที่อยู่ / พอร์ตที่เป็น ใช้สำหรับ vhosts แบบใช้ชื่อหากคำขอมีส่วนหัวที่ไม่รู้จักหรือไม่โฮสต์: จะให้บริการจาก vhost ที่เป็นชื่อหลักเสมอ (vhost สำหรับที่อยู่ / พอร์ตนั้นจะปรากฏเป็นอันดับแรกในไฟล์กำหนดค่า) "

ตัวอย่างจาก httpd-vhosts.conf สด แต่ obfuscated ที่เกิดขึ้นเพื่อล็อค vhosts ทั้งหมดไปที่พอร์ต 80:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

คำอธิบายในเชิงลึกของกระบวนการจับคู่ vhost มีอยู่ที่นี่: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_จะใช้สำหรับIP ที่ไม่ได้จับคู่เท่านั้นดังนั้นเมื่อคุณมีไวด์การ์ดแบบ wildcard (*: 80) จะไม่ถูกใช้
Wirone

2

อักขระตัวแทนรวมไฟล์การกำหนดค่าไซต์ของคุณ:

Include path/to/site/confs/*httpd.conf

จัดระเบียบไฟล์ไซต์ของคุณเพื่อให้มีการโหลดตามลำดับที่คาดไว้ ตัวอย่าง...

01 httpd.conf

02 site1-httpd.conf

03 site2-httpd.conf

ฯลฯ ...

Apache จะอ่านสิ่งเหล่านี้ตามลำดับ จากนั้นสร้างรายการที่จะโหลดครั้งล่าสุดเสมอเพื่อจับโฮสต์เสมือนที่ไม่ตรงกันและส่งคืน 404 แทนที่จะโหลดไซต์เริ่มต้น

99 รับทั้งหมด-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

อย่าลืมเปลี่ยนพอร์ตด้วยพอร์ตอะไรก็ตามที่ httpd ของคุณรออยู่ หรือถ้าคุณมีการฟัง httpd บนอินเทอร์เฟซเฉพาะคุณจะต้องเพิ่ม catchall สำหรับแต่ละอินเตอร์เฟสแทนเช่น:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

หวังว่านี่จะช่วยได้ ฉันใช้วิธีนี้เพื่อโหลดไซต์ตามลำดับที่ฉันระบุและป้องกันโฮสต์เสมือนที่ไม่ตรงกันจากการโหลดไซต์ที่ไม่คาดคิด


1

ทางออกที่ดีที่สุดคือเปลี่ยนชื่อไฟล์การกำหนดค่าไซต์ที่ขึ้นต้นด้วย "1" ดังนั้นมันจะโหลดก่อนและนั่นจะเป็นไซต์เริ่มต้นของคุณ

Apache2 ทำให้ไฟล์ vhost ที่ถูกโหลดครั้งแรกเป็นหน้าเริ่มต้น


การติดตั้ง apache เริ่มต้นยังมี000-defaultโฮสต์เสมือนด้วยเหตุผลนี้
vp_arth

0

เมื่อใช้<VirtualHost *:port>และระบุ ServerName / ServerAlias ​​สำหรับโฮสต์ที่คุณสนใจซึ่งเป็นสิ่งที่ฉันต้องทำ

พื้นหลังเล็กน้อยในสถานการณ์ของฉัน:

ฉันมีที่อยู่ IP แบบไดนามิกจาก ISP ของฉันดังนั้นที่อยู่ IP ของฉันจะลงทะเบียนที่ บริษัท ที่ลงทะเบียนแบบไดนามิกที่อยู่ IP (noip.org ในกรณีของฉัน) หนึ่งใน "โฮสต์" ของฉันจำเป็นต้องลงทะเบียนที่การลงทะเบียน DNS ของฉันเป็น myabc.example.com เป็น CNAME ซึ่งชี้ไปที่ host1.ddns.net แต่ host2.ddns.net ถูกปล่อยทิ้งไว้อย่างที่เป็นอยู่ ฉันต้องการ myabc.example.com และ host1.ddns.net เพื่อไปที่ site1 และ host2.ddns.net เพื่อไปที่ไซต์ 2 และสิ่งอื่นรวมถึงที่อยู่ IP ของฉันเพื่อเริ่มต้น

ครั้งแรกที่อ่านไฟล์ conf จะเริ่มต้นคือ000_def.conf, 001_site1.conf, 002_site2.confจะอ่านในลำดับที่มี000_def.confเป็นเว็บไซต์เริ่มต้น (หมายเหตุ: ในกรณีของฉันฉันมี "ไฟล์" เหล่านี้/etc/apache2/sites-enabledซึ่งเป็นลิงก์แบบไดนามิกไปยังไฟล์ conf จริง/etc/apache2/sites-available)

เนื่องจาก ServerName กำลังถูกใช้ใน 001_site1.conf และ 002_site2.conf จึงต้องถูกตั้งค่าเป็น 000_def.conf

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.