0

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

允许的链接应如下所示:

subdomain.maindomain.com/aaa/bbb/ccc

并应改写为:

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

凡是不属于这种形式并且来自空的或外部的引荐来源网址的东西都应该转到主域并且没有变量:

maindomain.com/

我尝试了各种配置,子域文件夹中的最后一个 .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]

但它仍然没有做我想要的,它还将允许表单的子域请求重定向到主域,它还将变量作为请求添加到主域,转到此页面

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

你能帮我解决上面定义的情况吗?

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

谢谢!

4

2 回答 2

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]
于 2013-03-16T09:45:00.213 回答
0

你很接近。您只需要几个额外的部件

  • 该标志S=1不会有害,但也不是必需的。
  • 将引用条件移动到第一条规则并反转它。您可能还希望允许任何子域。
  • 添加一个额外的否定条件以排除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 来做这件事。

于 2013-03-16T12:10:48.570 回答