重写规则 - 离开 docroot

Rewrite rules - going outside the docroot

提问人:mercutio 提问时间:12/1/2008 更新时间:12/1/2008 访问量:3697

问:

假设目录结构如下,

htdocs/
  images/
  css/
  .htaccess
system/
  index.php
  ...

我想通过该 php 脚本路由所有传入的请求。我一直在尝试在htaccess中的一些重写规则,但是我似乎无法路由到文档根目录之外的文件。我在apache手册中找不到原因,所以最终求助于“包含”apache配置文件,其中规则不同。

有没有办法在 docroot 之外重写?

Apache .ht访问

评论


答:

3赞 Robert K 12/1/2008 #1

不可以,您不能在没有潜在巨大风险的情况下在 docroot 之外路由。

您应该将 放在文件夹内并在那里重写,而不是在外面。如果你要重写以处理索引,在 docroot 之外访问,并且你犯了一个小错误,它可能会被任何重写请求字符串的黑客利用。不漂亮!index.phphtdocs

评论

0赞 rr- 9/7/2014
犯错误也很容易。index.php
4赞 rojoca 12/1/2008 #2

许多框架所做的是使用重写将所有请求路由到一个文件,您可以在其中执行更复杂的路由。例如,.htaccess 文件可能是:

# ignore anything that's an actual file (eg CSS, js, images) 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
# redirect all other traffic to the index page
RewriteRule ^.*$ index.php [L]

其中 index.php 位于您的文档根目录 (htdocs/index.php) 中,您可以在适当的情况下安全地包含 System/index.php。

评论

0赞 benlumley 12/1/2008
记住要确保你不能包含任何基于查询字符串的旧文件 - 否则人们可能会尝试 /etc/passwd 或 /etc/httpd/httpd.conf 等 - 很糟糕!
0赞 Simon East 10/10/2011
对不起,但我认为你的回答根本没有解决这个问题。他问的是走出 docroot
0赞 rojoca 10/11/2011
@Simon - 此答案建议通过驻留在 docroot 中的文件包含 docroot 外部的文件。这可以防止直接访问 docroot 之外的文件,但仍然允许经过适当审查的请求在适当的情况下包含这些文件。htdocs/index.phphtdocs/index.php
0赞 Simon East 10/11/2011
哦,我明白了,所以 PHP 脚本而不是 mod_rewrite 模块。include()