将现有文件请求重写到子目录

时间:2017-07-13 14:43:06

标签: apache .htaccess mod-rewrite

我在共享主机上有一个php框架,这是我的目录结构:

root (can't change because of shared hosting; here's the .htaccess)
  vendor
  web (index.php, assets in subfolders like css, images or js)

我的.htaccess看起来像这样:

<IfModule mod_rewrite.c>
   Options -MultiViews
   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^ web/index.php [L]
</IfModule>

现在框架路由工作正常,但我希望Apache只在web文件夹中搜索所有现有文件(${REQUEST_FILENAME} !-f),而不是从根级别搜索。

示例:

http://www.domain.tld/hello/world(虚拟路径)被重写为index.php

找不到

http://www.domain.tld/css/bootstrap.css,因为该文件位于web / css文件夹中。

由于RewriteCond %{REQUEST_FILENAME} !-f

http://www.domain.tld/web/css/bootstrap.css会匹配

是否可以将RewriteCond %{REQUEST_FILENAME} !-f与现有文件的文件夹重写相结合?必须将所有其他请求重写为index.php

总而言之,我希望它类似于将VirtualHost-&gt; DocumentRoot设置为web文件夹。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以在站点根目录中使用这些规则.htaccess:

<IfModule mod_rewrite.c>
   Options -MultiViews
   RewriteEngine On
   RewriteBase /

   RewriteRule ^/?$ web/index.php [L]

   # if file is found in web/ folder then route it
   RewriteCond %{DOCUMENT_ROOT}/web/$1 -f
   RewriteRule ^(.+)$ web/$1 [L]

   # otherwise route it to web/index.php
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^ web/index.php [L]
</IfModule>