重定向到子目录不工作

时间:2014-04-26 18:35:37

标签: apache .htaccess mod-rewrite redirect

http://mydomain.com/设置为如下所示的文件夹:

/app/
/web/
    /assets/
    /.../
    /index.php
/.htaccess

在我的Apache 2.2服务器上的.htaccess我想将所有请求重定向到/web,如果不是/web下的现有文件重定向到/web/index.php

到目前为止,我有:

RewriteEngine On

RewriteRule ^$ /web/$1 [N]

RewriteBase /web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

根据我的理解,这意味着:

  1. 打开重写引擎
  2. 匹配任何内容并在/web/
  3. 前添加请求
  4. /web下匹配任何不是有效文件名的内容,并将其重定向到附加到/web/index.php的查询字符串
  5. 这会重定向到/web/index.php,但其他/web/下的文件请求无法正常投放。

    有关为何的原因有何解释?我得到的RewriteLog相当难以捉摸。

2 个答案:

答案 0 :(得分:1)

如果您想保留匹配的字符串,则需要在括号中添加表达式。 $ 1匹配括号中的第一个表达式,$ 2匹配第二个表达式等。

此外,[N]标志将导致您的规则重复运行,直到它不匹配任何内容。您可能希望避免使用这种类型的重写(因为循环)。 apache.org docs

的精彩信息
RewriteEngine On

RewriteRule ^((?!web/).*)$ /web/$1

RewriteBase /web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

答案 1 :(得分:1)

你可以这样做:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /web/index.php [L]

RewriteRule ^((?!web/).*)$ /web/$1 [L,NC]