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

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

首先,这是我第一次使用 apache,所以请原谅我的幼稚:)

我的基本设置如下: mysub.domain.com通过 godaddy 的 DNS 管理器上的 CNAME 条目发送到我的静态 IP。它会到达运行 Apache2 的 Ubuntu 10 LTS 服务器。

我有一个虚拟主机条目,可以将该请求定向到正确的/var/www/mysub文件夹。我那里没有任何内容,但我在“It Works”页面上添加了一行,这样我就能知道我是否成功到达那里。我还有一台 Mac Mini,在与 Ubuntu 服务器相同的本地网络上运行 wiki 服务器。

我想mysub.domain.com访问我的迷你服务器而不是/var/www/mysub文件夹。

在阅读了本网站和其他网站的大量资料后,我终于做到了......有点。

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

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

这很有效,因为它确实重定向mysub.domain.com到 Mini 的首页。但当然,Mini 页面上的每个后续链接点击也是如此。我想我明白它为什么这样做了(以 开头的任何内容mysub.domain.com都会被定向到 wiki 服务器的首页,并且由于 wiki 服务器上的后续链接也包括mysub.domain.com,它总是会到达同一个地方)

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


我已看到过无数配置条目的示例并尝试了其中的一些,但是由于没有真正理解语法,这就像是盲目地尝试。

是一篇很有用的文章,读完之后问题,我尝试将其添加到我的/apache2/httpd.conf文件中

<Location />
   ProxyPass http://192.168.x.x
   ProxyPassReverse http://192.168.x.x
</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.x.x/
      ProxyPassReverse http://192.168.x.x/
   </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

答案1

你很接近了!

几点说明:

  • RewriteCond %{HTTP_HOST} ^mysub.domain.com/*-HTTP_HOST变量仅包含mysub.domain.com,不包含路径的其余部分。

    该规则实际上匹配,但是意外地 - 那里没有/字符,但*修饰符适用于该/字符,意思是“重复/0 到无限次”。

    Apache 使用与 perl 兼容的正则表达式 - 为了匹配精确的主机,它应该如下所示:

    RewriteCond %{HTTP_HOST} ^mysub\.domain\.com$
    
  • RewriteRule .* http://192.168.x.x/ [P,L]- 这仅加载主页,因为它不包括传递的其余路径 - 使用标志时必须手动完成此[P]操作RewriteRule

    这应该有效:

    RewriteRule (.*) http://192.168.x.x/$1 [P,L]
    
  • ProxyPass设置几乎正确,只是它被文件中的设置覆盖.htaccess,因此未被使用。使用.htaccess对性能不利,并且可能对安全性造成问题 - 请参阅 Apache 文档中的建议这里

    可能最好的方法是直接删除.htaccess文件,然后使用ProxyPass。稍微更改一下配置...

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

    ...并将其从您的httpd.conf上方移动到<VirtualHost>为子域提供服务的块内。

    使用匹配的尾部斜杠并且不再有其他内容.htaccess,这应该可以解决问题!

答案2

这是拼图的最后一块。在问题。

解决方案是/etc/apache2/mods-enabled/proxy.conf

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

相关内容