在htaccess RewriteRule中排除特定的子域或没有子域

时间:2017-11-28 03:27:03

标签: regex .htaccess mod-rewrite

我将动态内容和静态内容保存在我的网络应用的不同子域中,但我最近发现如果直接调用动态内容可以在我的静态子域(www。)上查看,或者根本没有子域。

网址结构:

http(s)://(subdomain).(domain).(tld)/(static page) OR (direct/random hash) OR (secure/random hash)

所有静态内容都可以通过“WWW”访问,这导致我的SEO友好域名,如

http(s)://www.domain1.com/about
http(s)://www.domain1.com/
http(s)://www.domain2.com/about
http(s)://www.domain2.com/

通过网络应用查看的动态内容可以从

等域访问
http(s)://dynamic1.domain1.com/direct/randomhash
http(s)://dynamic2.domain1.com/direct/randomhash
http(s)://dynamic1.domain2.com/direct/randomhash
http(s)://dynamic2.domain2.com/direct/randomhash

这是我当前的.htaccess文件

重写URI以securedirect开头的动态链接以及index.php文件的任何文件扩展名的规则。

Header set Connection keep-alive
<IfModule mod_dir.c>
    DirectorySlash Off
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^index.php  - [L]
    RewriteRule ^(secure|direct)  /index.php [L]
    RewriteCond %{REQUEST_URI} !^/server-status
    RewriteCond %{REQUEST_URI} !^/public/cache
    RewriteRule !\.(png|gif|css|jpg|zip|js|html|htm|swf|ico|fon|ttf|otf|svg|woff|woff2|eot)$  /index.php [L]
</IfModule>

以上目前正在运行,但我的问题是,如果用户只是将用于动态内容的子域更改为WWW,它仍然可以工作,并且可以从我的SEO友好子域中访问动态内容。 / p>

我希望能够编辑此规则RewriteRule ^(secure|direct) /index.php [L],以便在有活跃的www.子域或没有子域的情况下将其排除在外,如果域或子域仍在工作是别的什么。

也就是说子域或域仍然是通配符,除非子域是www.

我假设我必须将%{HTTP_HOST}添加到RewriteRule ^(secure|direct) /index.php [L]并使用正则表达式来允许任何子域,域和tld,但我不知道如果http主机以万维网。或根本没有子域名。

我的最终目标是,在使用任何其他子域/域时,无法通过secure或无子域查看directwww.路径。

2 个答案:

答案 0 :(得分:6)

您可以使用:

RewriteCond %{HTTP_HOST} ^(?:www\.)?[^.]+\.[^.]+$ [NC]
RewriteRule ^(secure|direct)  /index.php [L]

答案 1 :(得分:3)

您应该为处理“安全”和“直接”请求的规则添加一个条件,这样它们只能来自您匹配的子域,而不是www。

RewriteCond %{HTTP_HOST}  ^dynamic[0-9]+\.[a-z]+ 
RewriteRule ^(secure|direct)  /index.php [L]

这样,只有具有与该规则匹配的子域的请求才会重新写入PHP脚本。如果用户将子域更改回www,或者更改为与条件中指定的模式不匹配的任何其他内容,则请求将无法找到PHP脚本。

如果动态子域的名称是真正随机的,那么只需使用您知道的其他内容,以便'www'不匹配,例如,如果它们的长度至少都是四个字符,那么这个模式会工作:

RewriteCond %{HTTP_HOST}  ^[^.][^.][^.][^.]+\. 
RewriteRule ^(secure|direct)  /index.php [L]

因为字符串'www。'不匹配以四个或更多非点开头然后是一个点的模式。