2010-08-16 96 views
3

我使用htaccess和一组规则来控制我网站的不同页面。Htaccess子域规则

  1. 如果用户访问我的主网站(domain.com),而不使用万维网其301重定向到www.domain.com(搜索引擎优化的目的)
  2. 我使用通配符子域,因此,如果用户访问子域.domain.com,他们将查看一个特定的PHP文件,决定为他们的内容。

我的问题是我想扩展我的设置,以便能够使用相同的url名称。作为一个例子,如果我访问subdomain.domain.com/feed,我会从主域规则中看到pages/public_news_feed.php文件,因为它共享了“/ feed”规则。我真正想要的是pages/public_subdomain_blog_feed.php!

如何为domain.com和subdomain.domain.com设置特定规则?

在此先感谢您,祝您有美好的一天!

#AuthName "Restricted Area" 
#AuthType Basic 
#AuthUserFile /var/www/user/data/www/domain.com/.htpasswd 
#require valid-user 

Options +FollowSymLinks 
RewriteEngine on 

#force domain setup to use www 
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] 
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L] 

#redirect subdomains to controller 
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^$ pages/public_subdomain_blog.php [L,QSA] 

RewriteCond %{REQUEST_URI} !-f 
RewriteRule ^(indsend-nyhed)$   pages/public_submit_news.php [L] 
RewriteRule ^(modeblogs)$    pages/public_blogs.php [L] 
RewriteRule ^(nyheder)$    pages/public_news.php [L] 
RewriteRule ^(feed)$     pages/public_news_feed.php [L] 
RewriteRule ^(nyheder)/([0-9]*)/(.*)$  pages/public_news_single.php?n_id=$2 [L] 
RewriteRule ^(kontrolpanel)$    pages/private_account.php [L,QSA] 
RewriteRule ^(kontrolpanel)/(logud)$   pages/private_logout.php [L] 


## THESE RULES SHOULD ONLY BE SET IF THE USERS IS ON A SUBDOMAIN 
RewriteRule ^([0-9]*)/(.*)$   pages/public_subdomain_blog_article.php?p_id=$1 [L] 
RewriteRule ^(kategori)/([0-9]*)$  pages/public_subdomain_blog.php?c_id=$2 [L] 
RewriteRule ^(arkiv)/([0-9]*)$  pages/public_subdomain_blog.php?a_id=$2 [L] 
RewriteRule ^(feed)$    pages/public_subdomain_blog_feed.php [L] 
+0

你为什么访问者重定向到WWW网址是什么? – derekerdmann 2010-08-16 12:15:05

+0

因为到domain.com的传入链接没有为www.domain.com提供linkjuice。然而,人们选择建立他们的联系,无论有没有www,我然后保存所有linkjuice,最终转化为公关。 – Kristian 2010-08-16 12:26:42

回答

2

嗯,你已经知道如何调理用户是否是一个子域,因为你的控制器做已经:

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^$ pages/public_subdomain_blog.php [L,QSA] 

虽然它可能是也可能不是能够简化你的整个规则集有点简单,最简单的做法就是以相同的方式调整你的规则。既然你有更少的子域的规则,我们可以将上述主网站的规则和条件适用的重写,使用你具备的条件:

## THESE RULES SHOULD ONLY BE SET IF THE USERS IS ON A SUBDOMAIN 
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^([0-9]*)/(.*)$  pages/public_subdomain_blog_article.php?p_id=$1 [L] 
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^(kategori)/([0-9]*)$ pages/public_subdomain_blog.php?c_id=$2 [L] 
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^(arkiv)/([0-9]*)$ pages/public_subdomain_blog.php?a_id=$2 [L] 
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^(feed)$    pages/public_subdomain_blog_feed.php [L] 

RewriteCond %{REQUEST_URI} !-f 
RewriteRule ^(indsend-nyhed)$   pages/public_submit_news.php [L] 
RewriteRule ^(modeblogs)$    pages/public_blogs.php [L] 
RewriteRule ^(nyheder)$    pages/public_news.php [L] 
RewriteRule ^(feed)$     pages/public_news_feed.php [L] 
RewriteRule ^(nyheder)/([0-9]*)/(.*)$ pages/public_news_single.php?n_id=$2 [L] 
RewriteRule ^(kontrolpanel)$   pages/private_account.php [L,QSA] 
RewriteRule ^(kontrolpanel)/(logud)$ pages/private_logout.php [L] 
+0

我正在寻找一种像if语句一样来包围所有规则的方法。虽然我觉得自从RewriteCond完成这项工作后感觉很傻。谢谢! – Kristian 2010-08-16 12:29:40

+0

@kris - 是的,这很有道理。但是,当你的规则不相互关联时(不依赖于另一个),通常不是很容易,因为'mod_rewrite'没有提供必要的控制结构。关于我的头,你可以用'RewriteCond'来做一些骇人的事情来压缩一些东西,但是这比我在这种情况下的价值更加混乱。 – 2010-08-16 12:35:03

+0

只要按照你的例子。再次感谢。 – Kristian 2010-08-16 12:41:03