Bagaimana cara mengalihkan subdomain ke port lain di server yang sama?

67

Saya memiliki beberapa subdomain yang ingin saya arahkan ke port tertentu di server yang sama. Katakan saya punya

dev.mydomain.com 

Saya ingin dev.mydomain.commengarahkan ulang secara transparan mydomain.com:8080dan saya ingin mempertahankan nama sub-domain asli url browser.

Bagaimana saya melakukan ini dengan Apache 2.2? Saya memiliki Apache 2.2 yang berjalan pada port default 80. Saya tidak tahu konfigurasi penulisan untuk mewujudkannya.

Saya sudah mengatur dev.mydomain.comuntuk menyelesaikan di DNS ke mydomain.com.

Ini untuk server pengembangan intranet yang memiliki alamat ip non-routable jadi saya tidak begitu khawatir tentang eksploitasi dan keamanan yang akan membahayakan server yang menghadap publik.


sumber

Jawaban:

69

Larutan

Inilah yang akhirnya saya dapatkan setelah diatur ke arah yang benar oleh Miles Erickson. Saya ingin bilah alamat untuk mencerminkan subdomain / domain asli dari permintaan dan bukan server dan port yang dialihkan, tetapi dia menempatkan saya di jalur yang benar untuk Google menggunakan solusi VirtualHostdan akhirnya saya menemukan solusi yang mencakup penggunaan mod_proxy.

<VirtualHost *:80>
    ServerAdmin [email protected]
    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>
pengguna3037143
sumber
7
Untuk semua orang yang jawabannya tidak berhasil, perlu diingat bahwa Anda harus mengaktifkan mod mod_proxyjuga proxy_http.
matewka
9

Dengan asumsi bahwa dev.mydomain.com dapat diatasi ke IP mydomain.com, Anda dapat menambahkan yang berikut ke httpd.conf Anda:

NameVirtualHost *:80

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

Dokumentasi Apache yang relevan:

  1. Panduan untuk membuat host virtual berbasis nama
  2. Inti , termasuk VirtualHost dan NameVirtualHost
  3. Arahkan ulang

Pertanyaan terkait: Redirect Apache berdasarkan nama host

(Catatan: versi asli dari jawaban ini secara tidak tepat menyarankan penggunaan RedirectMatch, yang, seperti ditunjukkan oleh @ChrisS, tidak dapat menguraikan bagian domain dari URL.)

Skyhawk
sumber
1
lihat jawaban yang saya berikan sendiri untuk apa yang sebenarnya saya gunakan, yaitu gagasan tentang VirtualHost dengan mod_proxy untuk mempertahankan host asli alih-alih melakukan redirect. Ini adalah server internal jadi saya tidak peduli dengan keamanan atau eksploitasi mod_proxy.
1
Menemukan banyak saran lain tetapi ini akhirnya berhasil untuk saya di Windows Server 2008 R2 / Apache 2.2.25.
HPWD
1
Masalah dengan solusi ini adalah bahwa di saudara Anda, Anda tidak tinggal di domain pertama, Anda mendapatkan 302 ke yang kedua.
Pleymor
7

Jalankan baris berikut di terminal (tentukan domain dan nama domain Anda dengan benar)

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

Rekatkan kode berikut dan ubah sebagai kebutuhan Anda

<VirtualHost *:80>
        ServerAdmin [email protected]
        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>

Jalankan baris berikut di terminal (tentukan domain dan nama domain Anda dengan benar)

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite subdomain.example.com.conf
sudo service apache2 restart
MAK Ripon
sumber
3
Apakah ada perbedaan mendasar antara ini dan jawaban yang diterima?
kasperd
1
Sebagian besar orang lupa menambahkan sudo a2enmod proxy_httpsehingga mereka menghadapi kesulitan berjalan dengan benar. Saya juga mencoba memberikan proses penuh dari awal hingga akhir secara berurutan untuk membantu lebih akulturasi. Terima kasih atas pertanyaan anda
MAK Ripon
1
+1 karena menyebutkan "ProxyRequests Off"
Sebastian
1
Ini tidak bekerja untuk saya. 'sudo a2enmod subdomain.domain.com.conf' mengatakan "GALAT: Modul xyz tidak ada!" Apakah harus disebutkan dalam konfigurasi 'default'?
Dirk Schumacher
2
Koreksi dalam mendaftarkan subdomain sudo a2ensite sub.yourdomain.com
Ali Azhar
5

Tambahkan di konfigurasi vhost utama Anda baris berikut:

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

Perhatikan bahwa ini memerlukan mod_proxy di Apache.

Ryszard Stawiarski
sumber
Ini bukan redirect; itu proksi koneksi. Mengaktifkan mod_proxy bisa sangat mudah dieksploitasi jika Anda tidak terlalu berhati-hati mengonfigurasinya. Saya akan sangat merekomendasikan hal ini.
Chris S
4
Dia tidak ingin pengalihan, sesuai OP-nya. Dia ingin URL asli tetap di bilah alamat; ini berarti menggunakan mod_proxy atau mod_rewrite, dan kalian sebaiknya menghindari mod_rewrite.
adapttr
4

Anda mencari mod_rewrite. Berikut tautan ke dokumentasi Apache yang mencakup banyak contoh untuk konfigurasi dasar dan lanjutan ..

Dan jika Anda tidak dapat menafsirkan dokumentasi sendiri, coba tambahkan ini ke httpd.conf:

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

Dan jika itu bukan contoh yang jelas, berikut juga tautan ke panduan pemula mod_rewrite .

Chris S
sumber
1
Saya menggunakan hosting bersama. Menulis ulang adalah satu-satunya pilihan. Saya dapat membuat file .htaccess, tetapi bukan proxy atau virtual host.
Abalter