首先,这是我第一次使用 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>