我正在尝试将所有请求路由到/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>
答案 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,因此路由应该可以直接使用。