Apache Mod前端控制器重写模式


Apache Mod Rewrite For Front Controller Pattern

我的.htaccess文件中有以下内容:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ _service.php?uri=$1 [NC,L]
</IfModule>

唯一的问题是没有发生重写,当我试图访问服务器localhost的根页面时,我只看到了一个目录列表。

即使我试图使匹配成为可选RewriteRule ^(.*)?$ _service.php?uri=$1 [NC,L],它也不起作用。

重写似乎适用于任何其他情况,例如localhost/foo/bar

对于这种特殊情况,我该如何进行重写?

问题是根目录是一个目录。所以这个条件阻止了你的规则被应用:

RewriteCond %{REQUEST_FILENAME} !-d

尝试添加一个规则,如:

RewriteRule ^$ _service.php?uri=/ [NC,L]

或者

您可能需要指定文档根目录才能找到文件或目录;我对这种模式的变体是:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} !-d
RewriteRule . /index.php [L,QSA,B]

在这种情况下(例如http://www.example.com/),根页面是正确提供的(对我来说)。注意,我在vhost.conf中有这个,而在.htaccess中没有。