我有一些子域我想重定向到同一服务器上的特定端口。
说我有

dev.mydomain.com 


我希望dev.mydomain.com透明地重定向到mydomain.com:8080和我想要保留原始子域名的浏览器URL。

如何使用Apache 2.2做到这一点?我在默认端口80上运行了Apache 2.2。我无法弄清楚写入配置是否可以实现。

我已经设置了dev.mydomain.com可以在DNS中解析为mydomain.com


这是对于具有不可路由ip的Intranet开发服务器,因此我不太担心漏洞利用和安全性,以至于
会损害面向公众的服务器。


#1 楼

解决方案
这是我在迈尔斯·埃里克森(Miles Erickson)设定正确方向之后终于想到的。我希望地址栏反映请求的原始子域/域,而不是重定向的服务器和端口,但他使我使用VirtualHost进入了Google正确的解决方案,最后我找到了一个包括mod_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>


评论


对于这个答案不起作用的每个人,请记住,您必须启用mods mod_proxy以及proxy_http。

–matewka
15年11月20日在19:47

那在nginx中呢?

– rosefun
20年12月1日,14:41

#2 楼

在终端上运行以下行(正确指定您的域名和子域名)

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


评论


此答案与接受的答案之间有本质区别吗?

–卡巴斯德
16年1月18日在10:13

大多数人忘记添加sudo a2enmod proxy_http,因此他们在正常运行时会遇到困难。另外,我尝试按顺序给出从头到尾的完整过程,以帮助您更好地适应。感谢您的提问。

– M.A.K.里彭
16 Jan 18'在10:34



+1是因为提及“ ProxyRequests Off”

–塞巴斯蒂安
17年2月7日在8:27

这对我不起作用。 “ sudo a2enmod subdomain.domain.com.conf”说“错误:模块x.y.z不存在!”是否必须在“默认”配置中提及?

–德克·舒马赫(Dirk Schumacher)
17年4月17日在9:17



更正注册子域sudo a2ensite sub.yourdomain.com

–阿里·阿扎尔(Ali Azhar)
17年8月1日在19:53

#3 楼

假设dev.mydomain.com可以解析为mydomain.com的IP,则可以在httpd.conf中添加以下内容:

NameVirtualHost *:80

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


相关的Apache文档:


创建基于名称的虚拟主机的指南

包括VirtualHost和NameVirtualHost在内的核心

重定向

相关问题:
基于主机名的Apache重定向

(注意:该答案的原始版本错误地建议使用RedirectMatch,正如@ChrisS所指出的那样,它无法解析RedirectMatch的域部分URL。)

评论


请参阅我自己提供的关于我实际使用的答案的内容,这是带有Mod_proxy的VirtualHost的想法,用于保留原始主机而不进行重定向。这是一台内部服务器,因此我不关心安全性或对mod_proxy的利用。

–user35861
2010-10-28 15:38

找到了许多其他建议,但这最终在Windows Server 2008 R2 / Apache 2.2.25上对我有用。

– HPWD
15年7月12日在20:07

此解决方案的问题在于,在您的兄弟中,您不停留在第一个域上,而第二个则得到302。

– Pleymor
17年2月9日在12:20

#4 楼

在您的主要vhost配置中添加以下行:

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


请注意,这需要在Apache上使用mod_proxy。

评论


这不是重定向;它代理连接。如果您不太谨慎地配置mod_proxy,则启用它非常容易。我强烈建议您不要这样做。

–克里斯S
2010-10-28 12:38

根据他的操作,他不希望重定向。他希望原始URL保留在地址栏中。这意味着使用mod_proxy或mod_rewrite,最好避免使用mod_rewrite。

–适配器
2012年3月1日14:40在

#5 楼

您正在寻找mod_rewrite。这是Apache文档的链接,其中包含许多基本和高级配置示例。.

如果您自己无法解释文档,请尝试将其添加到httpd.conf中:

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


如果不是一个清晰的例子,这也是到mod_rewrite初学者指南的链接。

评论


我正在共享主机上。重写是唯一的选择。我可以创建.htaccess文件,但不能创建代理或虚拟主机。

– abalter
18年2月15日在17:18