【问题标题】:Mod-Rewrite loading files behind the DocumentRootMod-Rewrite 在 DocumentRoot 后面加载文件
【发布时间】:2008-08-12 03:58:21
【问题描述】:

我使用.htaccessmod_rewrite 来指向位于 DocumentRoot 后面的文件。我的文件夹结构如下所示:

home/
    webroot/
    other_files/

我在 webroot 中有一个 .htaccess 文件,其内容如下:

重写引擎开启 重写规则 ^(.*)$ /home/other_files/$1

如果我尝试访问http://example.com/file.html,我会收到以下错误:

在此服务器上找不到请求的 URL /home/other_files/file.html。

甚至可以加载 DocumentRoot 后面的文件吗?如果是这样,有人可以指出我正确的方向吗?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    我相信您需要添加一个带有

    的部分
    <Directory "/home/other_files">
      (options)
    </Directory>
    

    在 apache 能够从中提供任何服务之前,您的服务器配置。例如,我的 DocumentRoot 是 /var/www,但默认可用站点中有此部分:

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
    

    然后您可以重写 URL 以转到 /doc/,服务器将知道从哪里获取文件。

    【讨论】:

    • 我尝试在没有 部分的情况下将别名添加到 DocumentRoot 之外的目录,并且它有效...
    • @Pere 您需要授予对“DocumentRoot 外部目录”某处的访问权限。如果您不必为该目录显式包含 &lt;Directory&gt; 部分,那么您可能已经在配置中的其他位置拥有 &lt;Directory&gt; 部分,该部分授予对父目录的访问权限。
    【解决方案2】:

    让您知道为什么该规则不起作用:

    它无法重写为/home/other_files/file.html 的原因是mod_rewrite 将路径解析为/home/webroot/home/other_files/file.html,因为从mod_rewrite 的角度来看,前面的斜杠等同于/home/webroot 的文档根。

    Ryan Ahearn's suggestion 是一个不错的选择,很可能是你想去的路线。

    【讨论】:

    • "mod_rewrite 将路径解析为/home/webroot/home/other_files/file.html" - 是的。 除非规则在 servervirtualhost 上下文中定义(即不是.htaccess),在这种情况下它将接受绝对文件系统路径以及(作为相对于根的 URl 路径)。
    【解决方案3】:

    这要归功于 Ryan Aheam,但我将把它拼出来。我是一个初学者,即使是 Ryan 的回答,我也不得不尝试一些方法来获得正确的语法。

    我希望我的DocumentRoot 成为我的cakephp 目录。但是后来我有了一个 Mantis Bug 跟踪器,它只是普通的 PHP,所以不在 cakephp 目录中。下面的文件我有以下工作。

    http://www.example.com:由/var/www/cakephp提供服务

    http://www.example.com/mantisbt:由/var/www/html/mantisbt提供服务

    文件/etc/httpd/conf/httpd.conf

    Alias /mantisbt/ "/var/www/html/mantisbt/"                                                                          
    <Directory "/var/www/html/">                                                                                        
        AllowOverride All                                                                                               
    </Directory>                                                                                                        
                                                                                                                        
    <VirtualHost *:80>                                                                                                  
        ServerAdmin me@my_email.com                                                                             
        DocumentRoot /var/www/cakephp                                                                                   
        ServerName my_website.com                                                                                      
        <Directory /var/www/cakephp/>                                                                                   
            AllowOverride All                                                                                           
        </Directory>                                                                                                    
    </VirtualHost>
    

    文件/var/www/cakephp/.htaccess

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteRule    ^mantisbt/?$   /mantisbt/  [NC,L]
        RewriteRule    ^$    webroot/    [L]
        RewriteRule    (.*) webroot/$1    [L]
    </IfModule>
    

    【讨论】:

    • “我将把它拼出来” - 尽管您还需要授予对作为 Alias 目标的区域(文档根目录之外)的访问权限(作为 Ryan正在做他的回答,尽管是针对 Apache 2.2)。您可能已经为父目录执行了此操作,但最好仅针对相关目录执行此操作。此外,除非从多个 vHost 访问 /mantisbt,否则最好将这些指令放在相关的 vHost 配置中,而不是在 server 配置中使用“全局”。
    猜你喜欢
    • 2013-12-07
    • 2015-09-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多