ฉันจะเปลี่ยนเส้นทางโดเมนย่อยไปยังพอร์ตอื่นบนเซิร์ฟเวอร์เดียวกันได้อย่างไร


67

ฉันมีโดเมนย่อยบางตัวที่ฉันต้องการเปลี่ยนเส้นทางไปยังพอร์ตเฉพาะบนเซิร์ฟเวอร์เดียวกัน บอกว่าฉันมี

dev.mydomain.com 

ฉันต้องการdev.mydomain.comเปลี่ยนเส้นทางไปที่โปร่งใสmydomain.com:8080และฉันต้องการรักษาชื่อโดเมนย่อยดั้งเดิมไว้เป็น URL ของเบราว์เซอร์

ฉันจะทำสิ่งนี้กับ Apache 2.2 ได้อย่างไร ฉันใช้ Apache 2.2 บนพอร์ตเริ่มต้น80แล้ว ฉันไม่สามารถระบุการตั้งค่าการเขียนเพื่อให้สิ่งนี้เกิดขึ้น

ฉันได้ตั้งค่าdev.mydomain.comให้แก้ไขใน DNS ถึงmydomain.comแล้ว

นี่เป็นเซิร์ฟเวอร์การพัฒนาอินทราเน็ตที่มีที่อยู่ ip ที่ไม่สามารถกำหนดเส้นทางได้ดังนั้นฉันจึงไม่กังวลเกี่ยวกับการหาช่องโหว่และความปลอดภัยที่อาจส่งผลกระทบต่อเซิร์ฟเวอร์สาธารณะ

คำตอบ:


69

วิธีการแก้

นี่คือสิ่งที่ในที่สุดฉันก็เกิดขึ้นหลังจากถูกตั้งค่าในทิศทางที่ถูกต้องโดย Miles Erickson ผมอยากแถบที่อยู่เพื่อสะท้อนให้เห็นถึงเดิมโดเมนย่อย / โดเมนของการร้องขอและไม่เปลี่ยนเส้นทางเซิร์ฟเวอร์และพอร์ต แต่เขาวางฉันในเส้นทางที่ถูกต้องไปยัง Google ถึงวิธีการแก้ปัญหาโดยใช้และในที่สุดผมก็พบว่าวิธีการแก้ปัญหารวมถึงการใช้เป็นVirtualHostmod_proxy

<VirtualHost *:80>
    ServerAdmin me@mydomain.com
    ServerName dev.mydomain.com
    ProxyPreserveHost On

    # setup the proxy
    <Proxy *>
        Order allow,deny
        Allow from all
    </Proxy>
    ProxyPass / http://localhost:8888/
    ProxyPassReverse / http://localhost:8888/
</VirtualHost>

7
สำหรับทุกคนที่คำตอบนี้ไม่ได้ทำงานให้เก็บไว้ในใจว่าคุณต้องเปิดการใช้งานวัยรุ่นเช่นเดียวกับmod_proxy proxy_http
matewka

9

สมมติว่า dev.mydomain.com สามารถแก้ไข IP ของ mydomain.com ได้คุณสามารถเพิ่มสิ่งต่อไปนี้ใน httpd.conf ของคุณ:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName dev.mydomain.com
    redirect / http://mydomain.com:8080/
</VirtualHost>

เอกสาร Apache ที่เกี่ยวข้อง:

  1. คู่มือการสร้างโฮสต์เสมือนตามชื่อ
  2. คอร์รวมถึงVirtualHostและNameVirtualHost
  3. เปลี่ยนเส้นทาง

คำถามที่เกี่ยวข้อง: การ เปลี่ยนเส้นทาง Apache ตามชื่อโฮสต์

(หมายเหตุ: เวอร์ชันเดิมของคำตอบนี้แนะนำการใช้ RedirectMatch อย่างไม่ถูกต้องซึ่งเนื่องจาก @ChrisS ชี้ให้เห็นอย่างเป็นประโยชน์ไม่สามารถแยกส่วนโดเมนของ URL ได้)


1
ดูคำตอบที่ฉันได้ให้ด้วยตนเองสำหรับสิ่งที่ฉันใช้จริงซึ่งเป็นแนวคิดของ VirtualHost พร้อม mod_proxy เพื่อรักษาโฮสต์ดั้งเดิมไว้แทนที่จะทำการเปลี่ยนเส้นทาง นี่เป็นเซิร์ฟเวอร์ภายในดังนั้นฉันจึงไม่เกี่ยวข้องกับความปลอดภัยหรือการใช้ประโยชน์จาก mod_proxy

1
พบข้อเสนอแนะอื่น ๆ อีกมากมาย แต่ท้ายที่สุดฉันก็ใช้งานได้กับ Windows Server 2008 R2 / Apache 2.2.25
HPWD

1
ปัญหาเกี่ยวกับวิธีแก้ปัญหานี้ก็คือว่าในพี่ชายของคุณคุณไม่ได้อยู่ในโดเมนแรกคุณได้ 302 ถึงวินาที
Pleymor

7

เรียกใช้บรรทัดต่อไปนี้บนเทอร์มินัล (ระบุโดเมนและชื่อโดเมนย่อยของคุณอย่างถูกต้อง)

sudo nano /etc/apache2/sites-available/subdomain.example.com.conf 

วางรหัสต่อไปนี้และเปลี่ยนตามความต้องการของคุณ

<VirtualHost *:80>
        ServerAdmin admin@example.com
        ServerName subdomain.example.com
        ServerAlias subdomain.example.com
        ProxyRequests Off

        #ProxyPass / http://localhost:8080/
        <Location />
                ProxyPreserveHost On
                ProxyPass http://example.com:8080/
                ProxyPassReverse http://example.com:8080/
        </Location>
     # Uncomment the line below if your site uses SSL.
     #SSLProxyEngine On
</VirtualHost>

รันบรรทัดต่อไปนี้บนเทอร์มินัล (ระบุโดเมนและชื่อโดเมนย่อยของคุณอย่างถูกต้อง)

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite subdomain.example.com.conf
sudo service apache2 restart

3
มีความแตกต่างที่สำคัญระหว่างสิ่งนี้กับคำตอบที่ยอมรับหรือไม่?
kasperd

1
คนส่วนใหญ่ลืมที่จะเพิ่มsudo a2enmod proxy_httpเพื่อให้พวกเขาประสบปัญหาในการทำงานอย่างถูกต้อง นอกจากนี้ฉันพยายามที่จะให้กระบวนการทั้งหมดตั้งแต่ต้นจนจบในลำดับที่จะช่วยให้มากขึ้น ขอบคุณสำหรับคำถามของคุณ
MAK Ripon

1
+1 เนื่องจากพูดถึง "ProxyRequests Off"
เซบาสเตียน

1
แค่นี้ใช้ไม่ได้สำหรับฉัน 'sudo a2enmod subdomain.domain.com.conf' กล่าวว่า "ข้อผิดพลาด: ไม่มีโมดูล xyz!" จำเป็นต้องพูดถึงในการกำหนดค่า 'เริ่มต้น' หรือไม่?
เดิร์คชูมัคเกอร์

2
การแก้ไขการลงทะเบียนโดเมนย่อย sudo a2ensite sub.yourdomain.com
Ali Azhar

5

เพิ่มในการกำหนดค่า vhost หลักของคุณในบรรทัดต่อไปนี้:

ProxyPreserveHost On
ProxyPass / http://example.com:8080/
ProxyPassReverse / http://example:8080/

โปรดทราบว่านี่ต้องใช้ mod_proxy บน Apache


นี่ไม่ใช่การเปลี่ยนเส้นทาง มันพร็อกซี่การเชื่อมต่อ การเปิดใช้งาน mod_proxy อาจเป็นเรื่องง่ายอย่างยิ่งถ้าคุณไม่ระมัดระวังในการกำหนดค่า ฉันอยากจะแนะนำกับสิ่งนี้
Chris S

4
เขาไม่ต้องการเปลี่ยนเส้นทางตาม OP ของเขา เขาต้องการให้ URL ดั้งเดิมคงอยู่ในแถบที่อยู่ นี่หมายถึงการใช้ mod_proxy หรือ mod_rewrite และคุณควรหลีกเลี่ยง mod_rewrite
adaptr

4

คุณกำลังมองหา mod_rewrite นี่คือลิงค์ไปยังเอกสารของ Apacheซึ่งมีตัวอย่างมากมายสำหรับการกำหนดค่าพื้นฐานและขั้นสูง ..

และหากคุณไม่สามารถตีความเอกสารด้วยตนเองลองเพิ่มไปที่ httpd.conf:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^dev\.example\.com$ [NC]        
RewriteRule ^(.*)$ http://example.com:8080$1 [R=301]    

และถ้านั่นไม่ใช่ตัวอย่างที่ชัดเจนนี่คือลิงค์ไปยังคู่มือเริ่มต้น mod_rewriteเช่นกัน


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