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]
根据我的理解,这意味着:
/web/
/web
下匹配任何不是有效文件名的内容,并将其重定向到附加到/web/index.php
的查询字符串这会重定向到/web/index.php
,但其他/web/
下的文件请求无法正常投放。
有关为何的原因有何解释?我得到的RewriteLog相当难以捉摸。
答案 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]