Apache重写或代理到内部服务器

首先,这是我第一次去阿帕奇,所以请原谅我的开端主义:)

我的基本设置是这样的: mysub.domain.com通过在godaddy的DNS经理的CNAME条目发送到我的静态IP。 它击中我运行Apache2的Ubuntu 10 LTS服务器。

我有一个虚拟主机条目,将该请求引导到正确的/var/www/mysub文件夹。 我没有任何内容,但是我在“It Works”页面添加了一行,所以我知道我是否成功。 我也有一台Mac Mini在Ubuntu服务器的同一个本地networking上运行一个wiki服务器。

我希望mysub.domain.com打我的迷你服务器,而不是/var/www/mysub文件夹。

经过多次阅读本网站和其他人,我已经设法做到了…种。

我在我的/var/www/mysub/.htacess有以下内容,这是我在另一个SF问题中find的(忘记复制链接)。

 RewriteEngine on RewriteCond %{HTTP_HOST} ^mysub.domain.com/* RewriteRule .* http://192.168.xx/ [P,L] 

这有效,因为它将mysub.domain.comredirect到Mini的首页。 但是,当然,每个后续链接点击迷你页面也是如此。 我想我明白为什么这样做了(任何以mysub.domain.com开头的mysub.domain.com都会直接指向wiki服务器的头版,并且由于wiki服务器上的后续链接也包含mysub.domain.com ,它总是结束在同一个地方)

我只是不知道该做什么不同。 说实话,我实际上并不了解这些Rewrite行的语法。


我已经看到了无数的configuration条目的例子,并尝试了其中的一些,但是没有真正理解语法,这是在黑暗中的拍摄。

这是一个有用的post,并在阅读这个问题后,我试着将其添加到我的/apache2/httpd.conf文件

 <Location /> ProxyPass http://192.168.xx ProxyPassReverse http://192.168.xx </Location> 

没有运气。

显然,我有一些学习要做,但在我看来,我想要做的可能很简单。 我错过了什么?


编辑每个评论

我的/etc/apache2/httpd.conf文件

 ServerName localhost <VirtualHost *:80> ServerName domain.com ServerAlias www.domain.com DocumentRoot /var/www/domain </VirtualHost> <VirtualHost *:80> ServerName mysub.domain.com DocumentRoot /var/www/mysub <Location /> ProxyPass http://192.168.xx/ ProxyPassReverse http://192.168.xx/ </Location> </VirtualHost> 

…和我的sites-available/mysub文件…

 <VirtualHost *:80> ServerAdmin [email protected] ServerName mysub.domain.com DocumentRoot /var/www/mysub #ProxyRequests Off <Location /> ProxyPass http://192.168.1.50/ ProxyPassReverse http://192.168.1.50/ </Location> <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/mysub> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/www/mysub/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> 

apache2ctl -S输出

 VirtualHost configuration: wildcard NameVirtualHosts and _default_ servers: *:80 is a NameVirtualHost default server 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain:1) port 80 namevhost mysub.domain.com (/etc/apache2/sites-enabled/mysub:1) Syntax OK 

你非常接近!

一对夫妇笔记:

  • RewriteCond %{HTTP_HOST} ^mysub.domain.com/*HTTP_HOSTvariables只包含mysub.domain.com ,而不包含path的其余部分。

    这个规则实际上是匹配的,但是偶然 – 这里没有/字符,但是*修饰符适用于/字符,意思是“重复/ 0到无限次”。

    Apache使用Perl兼容的正则expression式来匹配确切的主机,它应该看起来像这样:

     RewriteCond %{HTTP_HOST} ^mysub\.domain\.com$ 
  • RewriteRule .* http://192.168.xx/ [P,L] – 这只是加载主页,因为它不包括传递path的其余部分 – 当使用RewriteRule[P]标志时,必须手动完成。

    这应该工作:

     RewriteRule (.*) http://192.168.xx/$1 [P,L] 
  • ProxyPass安装程序几乎是正确的,除了被.htaccess文件中的设置覆盖外,所以没有被使用。 使用.htaccess对性能不利,可能会造成安全问题 – 请参阅Apache文档中的build议。

    最好的办法可能是彻底删除.htaccess文件,并使用ProxyPass 。 改变你的configuration一点点…

     <Location /> ProxyPass http://192.168.xx/ ProxyPassReverse http://192.168.xx/ </Location> 

    …并将其从您的httpd.conf移动到为该子域服务的<VirtualHost>块中。

    随着匹配的尾部斜线,没有更多.htaccess ,这应该做的伎俩!

这是难题的最后一部分。 发现它作为这个问题的答案。

解决的办法是在/etc/apache2/mods-enabled/proxy.conf有这个:

 <IfModule mod_proxy.c> ProxyRequests Off <Proxy *> AddDefaultCharset off Order deny,allow Allow from all </Proxy>