【问题标题】:Htaccess subdomain rulesHtaccess 子域规则
【发布时间】:2011-03-30 09:43:03
【问题描述】:

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

  1. 如果用户访问我的主站点 (domain.com),而不使用 www,它 301 会重定向到 www.domain.com(用于 SEO 目的)
  2. 我使用通配符子域,因此如果用户访问 subdomain.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]

【问题讨论】:

  • 为什么要将访问者重定向到 www 网址?
  • 因为到 domain.com 的传入链接没有为 www.domain.com 提供链接果汁。然而人们选择建立他们的链接,有或没有 www,然后保存所有的链接汁,最终转化为 PR。

标签: .htaccess subdomain


【解决方案1】:

好吧,你已经知道如何判断用户是否在子域上,因为你已经为你的控制器做了:

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]

【讨论】:

  • 我正在寻找一种像 if 语句一样的方法来围绕所有规则。虽然自从 RewriteCond 完成工作后我觉得很傻。谢谢!
  • @kris - 是的,这是有道理的。但是,当您的规则不相关(不要相互依赖)时,设置类似的东西通常不是很容易,因为mod_rewrite 不提供必要的控制结构。在我的脑海中,你可以用RewriteCond 做一些骇人听闻的事情来浓缩一些东西,但在这种情况下,我认为这比它的价值更混乱。
  • 只是按照你的榜样。再次感谢。
猜你喜欢
  • 2012-06-11
  • 2010-09-26
  • 2011-11-21
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多