我已经安装好了,效果几乎没问题,而且显然和这:
UseCanonicalNames off
<VirtualHost *:8888>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.example1\.com
RewriteCond %{HTTP_HOST} ^www\.[^.]+\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www\.([^.]+)\.com(.*) /var/www/html/$1$2 [L]
</VirtualHost>
它的作用是将所有内容重定向www.NNN.com
到example1
其各自的文件夹内/var/www/html/NNN
。这就是我需要的基本信息。它还有一个额外的好处,就是允许一个名称 ( example1
) 在其自身内托管所有其他名称example1/NNN/
,这同样运行良好!
主要的问题可能是,它全部配置在 Amazon ELB 后面,将端口 80 定向到内部 8888。
因此,到目前为止我发现的唯一问题是:如果我将浏览器指向,www.example.com/anything/
它就没问题,但是指向www.example.com/anything
(没有最后一个斜杠)它会将浏览器重定向到www.example.com:8888/anything/
带有example
或 的断开的链接NNN
。
现在我意识到我可能不应该使用 Rewrite 来实现这一点我已经尝试改变一切mod_vhost_alias但它让我一直疑惑有什么办法可以解决上述问题以及可能引发的任何其他问题,因为我没有使用“正确的方法”和UseCanonicalNames on
,ServerName
原因很明显(我认为我们不能ServerName
在没有多个 s 的情况下设置多个VirtualHost
s)。当然,使用它们是理想的,但我找不到任何方法,这就是为什么我现在要朝另一个方向走。
那么,有人站出来吗?:)
答案1
首先,您说得对,这是对 mod_rewrite 的严重滥用。
话虽如此,您在这里面临的问题与您的重写规则有关。看起来您正在捕获主机名后面的所有内容,但实际上您想要捕获的只是路径。因此,而不是
RewriteRule ^www\.([^.]+)\.com(.*) /var/www/html/$1$2 [L]
你要
RewriteRule ^www\.([^.]+)\.com(:[0-9]+)?/(.*) /var/www/html/$1/$3 [L]
答案2
正如我所说的,以下是我为解决问题所做的事情:
UseCanonicalNames off
NameVirtualHost *:8888
<VirtualHost *:8888>
ServerName example1.com
ServerAlias *.example1.com
# more stuff below just to illustrate why I don't like this solution
# redirect to HTTPS
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^login\.(.*)$
RewriteRule ^(.*) https://%1/login$1 [L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
RewriteRule ^/login(.*) https://%1/login$1 [L]
</VirtualHost>
<VirtualHost *:8888>
ServerAlias *
VirtualDocumentRoot /var/www/html/%-3
# more stuff below again, to illustrate why I don't like this solution
# redirect to HTTPS
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^login\.(.*)$
RewriteRule ^(.*) https://%1/login$1 [L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
RewriteRule ^/login(.*) https://%1/login$1 [L]
</VirtualHost>
当我等待并希望得到问题的答案时,这是我接受的解决方案。
我实际上很喜欢它,几乎比我尝试过的 Rewrite 还要喜欢——而且它在其他情况下更能保证工作。也许我应该再问一个问题,我们如何才能宏/模板/函数/做某事使用重复的代码只需写入一次即可。