.htaccess htaccess将子文件夹用作根目录

.htaccess htaccess将子文件夹用作根目录,.htaccess,.htaccess,我知道这类问题经常出现。但是经过几个小时的搜索,我什么也没找到 我正在用Slim制作一个网站。然而,在他们的文档中,他们使用/public作为根目录,这是我不想要的。我希望网站根目录为/。出于安全考虑,我创建了一个.htaccess重定向http://www.example.com/至http://www.example.com/public/,因此用户无法访问/src和其他文件夹: <IfModule mod_rewrite.c> RewriteEngine On

我知道这类问题经常出现。但是经过几个小时的搜索,我什么也没找到

我正在用Slim制作一个网站。然而,在他们的文档中,他们使用
/public
作为根目录,这是我不想要的。我希望网站根目录为
/
。出于安全考虑,我创建了一个
.htaccess
重定向
http://www.example.com/
http://www.example.com/public/
,因此用户无法访问
/src
和其他文件夹:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^$ /public [P]
</IfModule>
我必须将代码中的
'/'
替换为
'/public/'
,页面才能正常工作。我不喜欢那样。
要从URI中删除
/public
,我应该向Slim下面的
/public/.htaccess
添加什么

<IfModule mod_rewrite.c>
  RewriteEngine On

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

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>

重新启动发动机
RewriteCond%{REQUEST_URI}:$1^(/.+)/(.*):\2$
重写规则^(.*)-[E=基:%1]
重写cond%{REQUEST_FILENAME}-F
重写规则^index.php[QSA,L]
编辑:使用的解决方案 我将vhost重定向到
/public/
。我使用的web托管服务支持这一点,因此它是最好的解决方案

多亏了怀特先生。 (不需要
包装器,因为这里的mod_rewrite是强制性的,不是可选的。)

然后,所有URL(指向所有内容)都应该省略
/public
子目录

更新:但是,
/public/.htaccess
中的以下指令似乎仍在将
BASE
环境变量设置到
/public
子目录:

您只需注释掉(删除)上述指令并硬编码
BASE
env-var:

SetEnv BASE /
然而,目前还不清楚这在Slim框架中是否会成为一个问题。这可能是用来构造URL的(尽管不应该,因为这是文件系统路径,而不是用户访问页面的URL路径,并且可以用PHP轻松计算)


或者,
/public
中的所有内容都应该在您的文档根目录中(即您的公共目录…
public\u html
htdocs
等),然后是
/src
(和其他文件夹)将自然位于文档根目录之外,并且不需要附加指令/
.htaccess
文件来作为请求的根目录。(虽然不是每个共享服务器都可以让您访问文档根目录之上的内容,但它们应该这样做。)


或者,只需在服务器配置中将
DocumentRoot
更改为
/public

我仍然到处都可以看到/public,而不是正确的重新根目录。我将尝试另一种解决方案,显然我的主机允许。您需要确保
/public
不存在于任何URL中,包括指向静态资源(CSS、JS、图像等)的URL。上面是一个内部重写(不是“重定向”),因此它不应该公开
/public
子目录。另外,请确保您已清除浏览器缓存。啊,“问题”似乎是
BASE
被设置为
/public
——这可能是用来构建URL的(从而暴露子目录)。我将更新我的答案。我已经尝试了替代解决方案(将vhost设置为直接指向/public)。它甚至不起作用,URI一直变成“/public/…”。我刚刚试着注释.htaccess中的两行,但是我得到了一个500错误。我甚至不明白为什么裸瘦骨架不能正常工作(直到现在我甚至都没有编写任何代码)。。。替代方案确实有效。我刚刚有一个bug,它会强制使用浏览器缓存。叹息
 RewriteEngine On
 RewriteRule (.*) /public/$1 [L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
SetEnv BASE /