我正在构建一个广泛分发的应用程序,我想改变它的路由方式,以便所有文件都可以存在于文档根目录中,但仍然是安全的,就好像它们在doc根目录之上。
理想的设置是将应用程序文件夹置于根目录之上,如下所示:
/home
/---/username
/---/--->application
/---/---/--->all application files
/---/--->public_html
/---/---/--->all public files
但我知道这对我的应用程序的所有潜在用户来说都不是理想的,所以我更喜欢把它移到这样的结构中:
/home
/---/username
/---/--->public_html
/---/---/--->application
/---/---/---/--->all application files
/---/---/--->public
/---/---/---/-->all public files
基本上就是把所有东西都放在doc根目录下,禁止访问应用程序目录,并将所有请求路由到公共文件夹,这样我们就可以获得与doc根目录下的文件相同的安全性,但对于那些可能不希望在共享主机上设置这种类型的人来说,这更简单。
我想在public_html/index.php
中使用包含,其中包括public_html/public/index.php
,但我似乎无法使其工作。
正如我所理解的,如果你想让home/username/public_html
作为真正的 Apache文档根,拒绝从/application
目录访问,理想情况下,将所有web请求路由到/public
子目录而不是(大概对于不在专用服务器上的用户谁也不能安装在docroot之外)…如果我误解了问题,请告诉我,我会更新/删除答案;)
您应该能够在/home/username/public_html
中使用.htaccess文件实现这一点,如:
RewriteEngine on
# deny access to the application directory
RewriteRule ^application/? - [F]
# route all requests to the public directory that aren't already there
RewriteRule ^(?!public/)(.*)$ /public/$1 [L,QSA]
任何访问/application
目录的尝试将导致403错误,所有对http://www.myserver.tld/file.ext
的请求将被路由到http://www.myserver.tld/public/file.ext
。
注意:为了防止重定向的递归循环,重写规则将不重定向任何已经以/public
开头的URL路径…这意味着/public
下的任何文件都可以在http://www.mysite.tld/filename.ext
和 http://www.mysite.tld/public/filename.ext
上访问-这可能会扰乱搜索引擎。
为了更安全,你也可以添加一个.htaccess
文件到/application
目录,如:
Deny from all
用这个
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public_html/ [L]
RewriteRule (.*) public_html/$1 [L]
</IfModule>
你的应用中是否使用了框架?
你有代码的样本,我们可以访问了解你的问题?
基本上,你只需要在你的public_html文件夹中添加一个htaccess,将请求重定向到公共文件夹,并禁用对公共目录以外的任何目录的访问。