htaccess的子域无法按预期工作

时间:2012-03-12 19:11:49

标签: apache .htaccess mod-rewrite

我知道这是一个非常讨论的主题,但我无法弄清楚使用我的搜索技巧我做错了什么。

将以下文件夹结构作为domain.localboard.domain.local

的根目录
/
 app/
 bin/
 board/
     index.php
 src/
 vendor/
 web/
     index.php

此{。1}}文件夹中的.htaccess

/

访问<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^board.domain.local$ RewriteRule ^(.*)$ board/$1 [QSA,L] RewriteCond %{HTTP_HOST} ^domain.local$ RewriteRule ^(.*)$ web/$1 [QSA,L] </IfModule> 时出现内部服务器错误。访问board.domain.local效果很好,并将查询重定向到domain.local

为什么第一次重写不起作用?

3 个答案:

答案 0 :(得分:3)

您在没有RewriteBase的每个目录上下文中进行相对路径重写。为什么一个有效但另一个无效是由于其他地方的某些补偿因素在boardweb之间不一致。内部服务器错误可能是一个循环。检查错误日志。

RewriteEngine On
RewriteBase /   # need this sucker
RewriteCond %{HTTP_HOST} ^board.domain.local$
RewriteRule ^(.*)$ board/$1 [QSA,L]
RewriteCond %{HTTP_HOST} ^domain.local$
RewriteRule ^(.*)$ web/$1 [QSA,L]

在每个目录的上下文中,重写是在文件系统路径上完成的,而不是URL。重写仅在目录之后的路径部分完成,该目录被剥离。如果进行相对重写,则会在之后放回目录部分。然后,一个蠢货发生了:重写被视为一个URL! RewriteBase指定要重写的前缀(而不是天真地恢复路径前缀)以使其成为有效的URL。 RewriteBase说,“虽然我们正在处理目录/var/www/docroot,但它实际上代表了网址空间/,因此当从重写重新生成网址时,它们应该位于该空间中,而不是/var/www/docroot不是网址“。

问问自己:DocRoot是什么?那么当DocRoot由于缺少RewriteBase(错误地)作为前缀而导致URL被相对重写时会出现什么?通过您的配置跟踪对这些虚假URL的处理,您肯定会发现为什么会进入无限循环而另一个没有进入的原因。

答案 1 :(得分:0)

尝试添加一些条件以防止重写引擎循环(您的URI最终将成为/ board / board / board / board / board / board / board / board /等。)

RewriteEngine On

RewriteCond %{HTTP_HOST} ^board.domain.local$
RewriteCond %{REQUEST_URI} !^/board
RewriteRule ^(.*)$ board/$1 [QSA,L]

RewriteCond %{HTTP_HOST} ^domain.local$
RewriteCond %{REQUEST_URI} !^/web
RewriteRule ^(.*)$ web/$1 [QSA,L]

答案 2 :(得分:0)

这是Kaz的评论的补充,因为我同意他们,但它不符合评论字符限制。如果处理了.htaccess文件(在Per Directory上下文中),如果发生了一次或多次更改,这会改变URI,则会发生内部重定向。重新启动.htaccess扫描并评估规则。

默认情况下,只使用一组重写规则:那是.htaccess路径中最低RewriteEngine On的重写规则。因此,对于第二次传递中的domain.local请求和 if DOCROOT/web/.htaccess,对于DOCROOT/.htaccess的请求,将执行此操作而不是domain.local

另一个方面是循环问题,我看到你已经解决了每个规则的第二个重写问题。但是,这可能会失败,因为你有MultiViews启用的选项(另一个奇怪的Apache botch,它会对重写规则造成严重破坏),因为这会将查询分开并执行可以阻止这种类型的反递归条件的子查询。

所以我总是将MultiViews和DirectoryIndex与搜索列表联系起来。

您还可以将[NS]标志添加到所有规则,因为没有一个适用于子查询。我还设置了一个环境变量END = true来强制退出,当我想这样做并在我的规则的顶部使用这个塞子时:

 RewriteCond  %{IS_SUBREQ}%{ENV:END} true
 RewriteRule  ^                      -    [L]