使.htaccess用前端控制器重写所有对/ web的请求?

时间:2014-08-28 19:17:46

标签: php apache .htaccess mod-rewrite silex

我正在尝试将所有请求路由到/web/index.php(前端控制器),同时直接提供静态文件(如果存在)。

以下.htaccess file取自Symfony 2应用程序,似乎工作正常。请求将发送到./index.php,我可以访问./web/css/style.css之类的静态文件。我正在开发一个共享主机(不是一个好主机),而.htaccess似乎唯一有效(this会导致500错误)。

如何将所有请求路由到/web文件夹?似乎我需要更改E=BASE变量中的某些内容,我已尝试过[E=BASE:%1/web]但它不起作用。

我对重写规则有一点了解,你能指出我正确的方向吗?

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    # Rewrite all other queries to the front controller.
    RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>

4 个答案:

答案 0 :(得分:0)

我可能会离开这里...但不仅仅是:将最后一行更改为:

RewriteRule .? %{ENV:BASE}/web/index.php [L]

对于静态文件,需要在/ web文件夹中查找该文件是否存在。目前RewriteCond %{REQUEST_FILENAME} -f只检查所请求的文件路径是否存在。

尝试在RewriteCond%{REQUEST_FILENAME} -f之前抛出RewriteBase命令:

RewriteBase /web/
RewriteCond %{REQUEST_FILENAME} -f

答案 1 :(得分:0)

您可以使用以下代码替换.htaccess:

RewriteEngine On

RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=302,NC,NE]

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^((?!web/).*)$ web/$1 [L,NC]

答案 2 :(得分:0)

假设您的域名为 gremo_silex.com ,并且您的托管服务中包含

目录
~/domains/gremo_silex.com/public_html

(我过去几年使用的所有托管服务都有类似于此的目录结构)。 然后,您可以将Silex项目放在一个目录中(~/domains/gremo_silex.com)并将web目录重命名为public_html,这样您的网址就没有web

答案 3 :(得分:0)

我今天遇到了同样的问题。通常,Web主机允许您更改Apache的文档根目录(我的首选方法),但在这种情况下,它是不可能的。所以有一些hackery我编译了这个:

<IfModule mod_rewrite.c>
    RewriteEngine on

    # Serve all public files from /web/
    RewriteCond %{REQUEST_URI} !web/
    RewriteRule (.*) /web/$1 [L]

    # If file doesn't exist send to front controller
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [QSA,L]
</IfModule>

REQUEST_URI标头也会在没有/web前缀的情况下进入PHP,因此路由应该可以直接使用。