子域中的htaccess跳过重定向规则

时间:2013-03-16 09:27:39

标签: .htaccess mod-rewrite apache2

当我使用特定的子域链接格式时,我试图让我的子域的访问者只能直接进入。我知道这也会阻止SE,但我不希望子域被索引。

允许的链接应如下所示:

  

subdomain.maindomain.com/aaa/bbb/ccc

并且应该改写为:

  

subdomain.maindomain.com/index.php?a=aaa&b=bbb&c=ccc

如果不是这种形式并且来自空的或外部推荐人,则应该转到主域并且没有变量:

maindomain.com /

我尝试了所有类型的配置,我在subdomain文件夹中的最后一个.htaccess文件如下所示:

RewriteEngine on
RewriteRule ^/?(\w{3})/(\w{3})/(\w{3})$ index.php?a=$1&b=$2&c=$3 [S=1,L]

RewriteCond %{HTTP_REFERER} !^http://(www\.)?maindomain\.com [NC]
RewriteRule ^(.*)$ http://domain\.com/ [L]

但它仍然没有按照我的意愿行事,它还将允许表单的子域请求重定向到主域,并且它还将vars作为请求添加到主域,转到此页面

  

maindomain.com/?a=aaa&b=bbb&c=cee

你能帮助我解决上面定义的条件。

关于性能的第二个问题:我显然可以使用PHP进行此验证/重定向,您认为什么会更有效?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解你的逻辑,请试试这个:

RewriteEngine on
RewriteBase /

# Don't do any more rewrites if on index.php
# Note that you can add the HTTP_HOST condition here if you only want it to be active for the subdomain
RewriteRule ^index\.php$ - [L]

# If on subdomain then check that the referer is from main domain and attempt to match a regex
# If we find a match then ignore the next rule that rewrites subdomain to domain.com
# Basically this is like an awkward if-else statement..
# ================    

RewriteCond %{HTTP_HOST} ^subdomain\.domain\.com$
RewriteCond %{HTTP_REFERER} ^http://(www\.)?domain\.com [NC]
# Rewrites /aaa/bbb/ccc to /index.php?a=aaa&b=bbb&c=ccc
RewriteRule ^(\w{3})/(\w{3})/(\w{3})$ index.php?a=$1&b=$2&c=$3 [S=1,L]

# Redirect all requests from subdomain to domain.com by default
# ================   

RewriteCond %{HTTP_HOST} ^subdomain\.domain\.com$
# Add the trailing question mark to delete all query parameters
RewriteRule .* http://domain.com/? [L]

答案 1 :(得分:0)

你非常接近。您只需要几个额外的部分

  • 标志S=1不会造成伤害,但也没有必要。
  • 将referer条件移动到第一个规则并将其反转。您可能也想要允许任何子域。
  • 添加其他否定条件,以排除index.php被重定向到主域。
  • 您不会在第二条规则中使用原始请求进行替换,因此您无需捕获它。
  • 附加问号?以防止参数转发到主域。
  • 如果您希望重定向客户端而不仅重写请求,请添加R标记。

所有部分在一起

RewriteEngine on

RewriteCond %{HTTP_REFERER} ^http://(.+\.)?maindomain\.com [NC]
RewriteRule ^(\w{3})/(\w{3})/(\w{3})$ index.php?a=$1&b=$2&c=$3 [L]

RewriteCond %{REQUEST_URI} !$index\.php$
RewriteRule ^ http://domain\.com/? [R,L]

关于性能,如果你只用.htaccess重写或重定向,那么这个工作甚至在它遇到一些PHP脚本之前就完成了。所以,我认为最好用.htaccess来做这件事。