Apache重写规则以删除任何域名上的端口

Apache重写规则以删除任何域名上的端口,apache,mod-rewrite,Apache,Mod Rewrite,我有一个具有一个IP地址的虚拟服务器,服务于几个不同的站点。其中一个上面有SSL证书 我需要在第二个域上添加一个SSL证书供自己私人使用,因为我只有一个IP地址,所以我将其添加到端口8080上。这个很好用 我现在的问题是,如果在该域上请求端口8080,那么所有指向服务器的域都将显示我的私有站点 https://example1.com:8080/ ->将显示我的私人网站,但不应 https://example2.com:8080/ ->将显示我的私人网站,但不应 https://desired

我有一个具有一个IP地址的虚拟服务器,服务于几个不同的站点。其中一个上面有SSL证书

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

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


https://example1.com:8080/ ->将显示我的私人网站,但不应
https://example2.com:8080/ ->将显示我的私人网站,但不应
https://desired-domain.com:8080/ ->将显示我的私人网站,这是正确的!

任何访问
https://example1.com:8080/
应重定向到
http://example1.com/
,同样适用于
example2.com

我试过


重写cond%{HTTP_HOST}!所需\-domain\.com[NC]


重写规则^(.*)$http://%{http_HOST}$1[L,R=301]

…但该端口附加到HTTP_主机,因此显示为
http://example1.com:8080/

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


额外的

我试过这个


重写cond%{HTTP_HOST}!(desired domain.com):8080$[NC]


重写规则^(.*)$http://%1$1[L,R=301]

…但它会重定向到
http://localhost/
。不过,这比显示错误站点的页面要好,因为无论如何,任何人都不应该在任何其他域上请求端口8080

我怀疑有一个更好的'desired domain.com'正则表达式,但我的正则表达式mojo今天无法运行。

也许可以试试:

RewriteCond %{HTTP_HOST} ^(example[12].com):8080$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
显然,您需要对HTTP_主机正则表达式有点了解,如果没有简单的方法将example1和example2域封装在一个正则表达式中,那么您可以使用两个正则表达式并使用[或]

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]

此外,我尝试了这里的提示:但它对我没有任何帮助!可能显式指定端口80是有效的:
RewriteRule^(.*)$http://%{http_HOST}:80$1[L,R=301]
insteadThank@Gerben,我试过了,但它只给出了
http://example1.com:8080:80/
!谢谢您的回答,但是
%1
不会重定向到用户请求的域名,它会重定向到服务器上定义的域名-因此这与我在重写规则中指定域是一样的。重写第二个是容易的一点,它工作得很好!%1是对RewriteCond中匹配项的反向引用,因此在上一个RewriteCond的参数()中匹配的任何内容都可以被%1(或%2、%3、%4等)引用,就像$1反向引用RewriteRule中的匹配项一样。在第二个解决方案中,如果http_主机不是example.com,则%1将为空。这是因为%1将只反向引用最后一个重写秒,而不是最后一个匹配的重写秒。嗯。。。现在让我再试一次!上一次我尝试
%1
,结果显示为
localhost
。如果这是一个regexp^(example1.com):8080$那里的点表示每个字符。也许你想逃避^(示例1\.com):8080$