代码之家  ›  专栏  ›  技术社区  ›  Pekka

mod_在htaccess中重写到绝对路径-打开404

  •  1
  • Pekka  · 技术社区  · 14 年前

    我要在URL中映射多个目录:

    www.example.com/manual
    www.example.com/login
    

    到Web根目录之外的目录。

    我的网络根目录是

    /www/htdocs/customername/site
    

    我要重定向到的手册位于

    /www/customer/some_other_dir/manual
    

    在mod_alias中,这等于

    Alias /manual /www/customer/some_other_dir/manual
    

    但我只能 .htaccess ,我不能使用别名,所以必须使用 mod_rewrite .

    我现在所拥有的 this question 具体如下:

    RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/manual/$2 [L]
    

    这在正确识别和重定向请求的意义上工作,但我得到了一个404,如下所示(注意绝对路径):

    The requested URL /www/htdocs/customername/manual/resourcename.htm 
    was not found on this server.
    

    不过,我已经用php检查过了: echo file_exists(...) 这个文件肯定存在。

    为什么会这样?根据mod_rewrite文档,这是可能的,即使在.htaccess文件中也是如此。我知道在.htaccess中执行mod_rewrite时,会有一个自动前缀,但不会是绝对路径,对吗?

    这也不应该是权限问题:它不在web根目录中,而是在ftp树中,只有一个用户(主ftp帐户)可以访问该树。

    我可以随时在控制面板中更改web根目录,但我希望它按我描述的方式工作。

    这是共享主机,因此我无法访问错误日志。

    我刚刚检查过,这不是错误的301重定向,只是内部重写。

    3 回复  |  直到 11 年前
        1
  •  2
  •   mtmk    14 年前

    afaik mod_rewrite在“protocol”级别工作(意思是在有线http上)。所以我怀疑你得到的是htp302,而你的目录路径在这个位置。

    所以我担心你会被卡住除非…您的宿主允许您跟踪符号链接;因此您可以链接到当前文档根目录下的那个位置(假设您有shell访问权限,或者这可以使用ftp或控制面板)。

    编辑: 它实际上提到 URL-file phase hook in the docs 所以现在我怀疑 directory directives 没有足够的权限。

        2
  •  3
  •   Steve Kallestad    11 年前

    在.htaccess中,不能重写到wwwroot之外的文件。

    您需要在webroot中有一个指向手册位置的符号链接。

    然后在.htaccess中,您需要一行:

    Options +SymLinksIfOwnerMatch
    

    或者更盲目一点

    Options +FollowSymlinks
    

    然后你可以

    RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/site/manual/$2 [L]
    

    如果站点下的手册是指向/www/customer/some_other_dir/manual的链接

    在命令行上使用以下命令创建符号链接:

    ln -s /www/htdocs/customername/site/manual /www/customer/some_other_dir/manual
    

    但是我想你在没有shell访问的共享主机上,所以请考虑在cpanel、webmin或任何管理界面中创建符号链接。还有一些php/cgi脚本也能做到这一点。当然,您仍然受限于主机授予您的权限。如果它们不允许您遵循符号链接作为策略,则不能在.htaccess中重写它。

        3
  •  -1
  •   BaroqueBobcat    14 年前

    这告诉你你需要知道什么。 请求的url/www/htdocs/customername/manual/resourcename.htm 在此服务器上找不到。 它解释 RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/manual/$2 [L] 意思是重写example.com/manual/就好像它是example.com/www/htdocs/customername/manual/。

    尝试

     RewriteRule ^manual(/(.*))?$ /customername/manual/$2 [L]
    

    相反。