如何仅重定向根域并忽略所有通配符子域?

时间:2017-08-07 21:42:45

标签: apache .htaccess redirect mod-rewrite

我查看了一堆stackoverflow页面和非stackoverflow网站,并尝试了很多东西。没有什么工作。

我需要my-example.net去example.com,我需要www.my-example.net去example.com,我需要忽略allothersubdomainsthatarenotwww.my-example.net而不做重定向。我可能希望将来排除某些其他子域,这就是为什么其中一个尝试有4个子域例外,但是现在让我们专注于忽略除www之外的所有子域。 www和非www应该去另一个域。如果我们可以保持路径的其余部分保持凉爽,如果不是,那么转到第二个域的根就没问题了。例如:

http://my-example.net/some/path/file.php?parameter=value can go to http://example.com/some/path/file.php?parameter=value, 
but if it's to difficult with wildcard subdomains, then going to http://example.com/ is fine.

只是你知道,我有其他规则以特定的方式处理通配符子域,并且工作正常。一些尝试似乎有效,但打破了我在子域上的其他规则集。例如,让我说我有一个anysubdomain.my-example.net转到my-example.net/folder/file.php?anysubdomain&domain=my-example.net ...那么一个或一个下面的尝试是让子域执行此操作,这不是我想要的:example.com/folder/file.php?anysubdomain&domain=example.com

子域名应该重定向到他们自己的域,长路径和主域名和www子域名应该重定向到辅助域名(保留或不保存路径的其余部分)

以下是我的尝试(每个行空间意味着新的尝试,但在几次尝试中,并非所有应该取消注释的行 - 我正在尝试尝试各种尝试):

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

#RewriteCond %{HTTP_HOST} ^my-example\.net$
#RewriteRule ^(.*)$ http://example.com/$1 [L,QSA,R=301]

#RewriteCond %{HTTP_HOST} ^my-example\.net$ [NC]
#RewriteRule ^. http://example.com/ [L,R=302]

#RewriteCond %{HTTP_HOST} ^(my-example\.net)$ [NC]
#RewriteRule ^. http://example.com/ [L,R=302]

#RewriteCond %{HTTP_HOST} my-example\.net [NC]
#RewriteCond %{REQUEST_URI} ^/$
#Rewriterule ^(.*)$ http://example.com/ [L,R=301]

#RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
#RewriteCond %{HTTP_HOST}   !^$
#RewriteRule ^/?(.*)         http://example.com/$1 [L,R,NE]

#RewriteCond %{HTTP_HOST} ^my-example\.net$ [NC]
#RewriteCond %{HTTP_HOST} !^(.+)\.my-example\.net$ [NC]
#RewriteRule ^(.*)$ http://example.com/$1 [L,QSA,R=301]

#RewriteCond %{HTTP_HOST} !^www
#RewriteRule .? http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#RewriteCond %{REQUEST_URI} ^(application|system)
#RewriteRule .? index.php?/%{REQUEST_URI} [L]
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule .? index.php?/%{REQUEST_URI} [L]

#RewriteCond %{HTTP_HOST} ^www\.my-example\.net$
#RewriteCond %{HTTP_HOST} ^www\.my-example\.net$ [OR]
#RewriteCond %{HTTP_HOST} ^my-example\.net$
#RewriteRule ^ http://example.com%{REQUEST_URI} [R=301,L,NE]
# Extract the subdomain part of domain.com
#RewriteCond %{HTTP_HOST} ^((?!www)[^.]+)\.my-example\.net$ [NC]
# Check that the subdomain part is not www, dev, old, or new
#RewriteCond %1 !^(www|dev|old|new)$ [NC]
# Redirect all requests to the original url /blog
#RewriteRule ^.*$ /%1 [L]

1 个答案:

答案 0 :(得分:0)

在提及ServerName my-example.net的VirtualHost子句中,将重定向配置为example.com。

在提及ServerName www.my-example.net的VirtualHost子句中,请对其进行类似配置。

"所有其他子域名"部分涉及DNS A记录(例如" *"通配符)和Apache配置。首先,使用digping查看子域名" foo"产生您的网络服务器的A(或AAAA)记录,即看看Apache是​​否做出决定。然后,为foo添加VirtualHost子句,或者仅依靠Apache的通配符默认匹配,根据需要提供200或302或404文档。

DNS控制客户端的GET请求是否到达端口80/443。客户端发送"主机:foo.my-example.net"请求中的标头。 Apache的VirtualHost参数传递给strcmp(),将其与客户端"主机:"进行比较。头。该比较的结果控制是否将VirtualHost子句的其余部分用于此请求。