使用前端控制器使.htaccess将所有请求重写到/web


Making .htaccess rewrite all requests to /web with a front controller?

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

下面的.htaccess file来自Symfony 2应用程序,看起来工作正常。请求被发送到./index.php,我可以访问像./web/css/style.css这样的静态文件。我正在处理一个共享主机(不是一个好的主机),而这个.htaccess似乎是唯一一个工作的主机(这将导致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>

我可能离这里很远。。。但不只是:把最后一行改成:

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

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

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

RewriteBase /web/
RewriteCond %{REQUEST_FILENAME} -f

您可以用以下代码替换.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]

让我们假设您的域是gremo_slex.com,并且您的主机有类似的目录

~/domains/gremo_silex.com/public_html

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

我今天遇到了同样的问题。通常情况下,web主机会允许您更改Apache的文档根目录(我喜欢的方法),但在这种情况下,这是不可能的。所以我用一些技巧编译了这个:

<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头在PHP中也没有/web前缀,所以路由应该是开箱即用的。