我正在尝试将所有请求路由到/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
前缀,所以路由应该是开箱即用的。