2010-08-16 134 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