反向引用仅适用于RewriteCond之后的第一个RewriteRule

时间:2014-05-05 19:30:27

标签: .htaccess mod-rewrite

背景:

我们已经开发了一个原始内容管理系统,以便我们可以构建一个新闻部分,产品评论部分等,与我们的网站集成。这些"官方" CMS网站应该可以在http://www.oursite.com/news获得。我们也希望提供"非正式的"我们社区成员的网站;这些将在例如http://membername.oursite.com处提供。我们将确保官方和非官方之间没有名称冲突。

问题:

以下是.htaccess的摘录:

###################################################
# Redirect localhost.dev to www.localhost.dev #
###################################################
RewriteCond %{HTTP_HOST} ^localhost.dev$ [NC]
RewriteRule ^(.*)$ http://www.localhost.dev/$1 [R=301,L]

##################################################################
# UNOFFICIAL HOSTED sites - redirect mysite.localhost.dev URLs #
##################################################################
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.localhost\.dev$ [NC]
RewriteRule ^/?$ hosted/index.php?site=%1 [NC,QSA,L]
RewriteRule ^post/?$ hosted/posting.php?site=%1 [NC,QSA,L]

##########################################################################
# OFFICIAL HOSTED sites - redirect www.localhost.dev/officialblog URLs   #
# Rationale: If /directory_name doesn't exist, maybe it's a hosted site. #
#            Pass it to hosted site handler, which will 404 if not       #
##########################################################################
RewriteCond %{HTTP_HOST} ^www.localhost.dev$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-z0-9_-]+)/?$ hosted/index.php?site=$1 [NC,QSA,L]
RewriteRule ^([a-zA-z0-9_-]+)/post/?$ hosted/posting.php?site=$1 [NC,QSA,L]

第一部分和最后一部分给出了预期的行为。它是"非官方托管网站"导致麻烦的部分。

http://unofficialblog.localhost.dev/有效 - 在托管/ index.php中,$ _GET ['网站']是"非官方博客"。 http://unofficialblog.localhost.dev/post无法正常工作 - 在托管/ posts.php中,$ _GET ['网站']是""。

我尝试了什么

交换这两个RewriteRules的顺序,反之亦然。因此,似乎%1仅在第一个中有效,而在第二个中无效。

如果我这样做:

##################################################################
# UNOFFICIAL HOSTED sites - redirect mysite.localhost.dev URLs #
##################################################################
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.localhost\.dev$ [NC]
RewriteRule ^/?$ hosted/index.php?site=%1 [NC,QSA,L]
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.localhost\.dev$ [NC]
RewriteRule ^post/?$ hosted/posting.php?site=%1 [NC,QSA,L]

然后$ _GET [' site']是" unofficialblog"在这两种情况下。

但那可怕的丑陋,我有大约十个像这样的RewriteRules。是否有更简洁的方法来保持对所有这些RewriteRules的子域的反向引用?

编辑:看起来像Multiple RewriteRules for single RewriteCond in .htaccess的副本,我昨天搜索时找不到。

1 个答案:

答案 0 :(得分:1)

只有一组重写条件之后的第一个重写规则是一组条件“相关”的规则。以下是条件如何运作的元细分:

  RewriteCond a1 (can evaluate  references from rule a)
  RewriteCond a2 (can evaluate  references from rule a)
  RewriteRule a <--the conditions a1, a2 apply only to things matching this rule
  RewriteRule b <--the conditions a1, a2 are not applicable to this rule

要使它们适用于这两个规则,您需要执行此操作:

  RewriteCond a1 (can evaluate  references from rule a)
  RewriteCond a2 (can evaluate  references from rule a)
  RewriteRule a

  RewriteCond copy of a1 (can evaluate  references from rule b)
  RewriteCond copy of a2 (can evaluate  references from rule b)
  RewriteRule b