Apache RewriteRule删除任何域名上的端口

时间:2012-03-08 00:59:09

标签: apache mod-rewrite

我有一个带有一个IP地址的虚拟服务器,可以为几个不同的站点提供服务。其中一个上面有SSL证书。

我需要在第二个域上添加SSL证书以供我自己私人使用,因为我只有一个IP地址,所以我将其添加到端口8080上。这很好用。

现在我的问题是,如果在该域上请求端口8080,则指向服务器的所有域都将显示我的私有站点。

https://example1.com:8080/ -> will show my private site, but shouldn't https://example2.com:8080/ -> will show my private site, but shouldn't https://desired-domain.com:8080/ -> will show my private site, this is correct!

任何访问https://example1.com:8080/的人都应该被重定向到http://example1.com/example2.com也是如此。

我试过......

RewriteCond %{HTTP_HOST} !desired\-domain\.com [NC]

RewriteRule ^(.*)$ http://%{HTTP_HOST}$1 [L,R=301]

...但该端口附加到HTTP_HOST,因此它显示为http://example1.com:8080/

因此,简而言之,我的问题是:如何重定向到请求的主机,但忽略请求端口?


EXTRA

我试过这个......

RewriteCond %{HTTP_HOST} !(desired-domain.com):8080$ [NC]

RewriteRule ^(.*)$ http://%1$1 [L,R=301]

...但重定向到http://localhost/。然而,这比显示错误网站的页面更好,因为无论如何没有人应该在任何其他域上请求端口8080!

我怀疑有一个更好的'desired-domain.com'正则表达式,但我的正则魔法今天不流动。

1 个答案:

答案 0 :(得分:1)

也许试试:

RewriteCond %{HTTP_HOST} ^(example[12].com):8080$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

显然,你需要对你的HTTP_HOST正则表达式有点聪明,如果没有简单的方法将你的example1和example2域封装在一个正则表达式中,你可以有2个然后使用 [ OR]

RewriteCond %{HTTP_HOST} ^(example1.com):8080$ [NC,OR]
RewriteCond %{HTTP_HOST} ^(example2.com):8080$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

编辑:

您无法匹配!(desired-domain.com):8080$等反向引用,因为表示不匹配。但你可以尝试这样的事情:

RewriteCond %{HTTP_HOST} !^desired-domain.com(:8080)?$ [NC]
RewriteCond %{HTTP_HOST} ^(.*):8080$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]