mod_rewrite到.htaccess中的绝对路径 - 出现404

时间:2010-02-02 23:04:53

标签: apache mod-rewrite

我想在网址中映射多个目录:

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 个答案:

答案 0 :(得分:3)

在.htaccess中,您无法重写到wwwroot之外的文件。

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

然后在你的.htaccess中你需要一行:

Options +SymLinksIfOwnerMatch

或者可能更盲目

Options +FollowSymlinks

然后你可以

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

其中site下的manual是指向/ 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中覆盖它。

答案 1 :(得分:2)

AFAIK mod_rewrite在'协议'级别工作(意味着在线路HTTP上)。因此,我怀疑您在该位置使用目录路径获取HTTP 302。

所以我担心你可能会被卡住,除非..你的主机让你跟随符号链接;因此,您可以链接到当前文档根目录下的该位置(假设您可以使用FTP或控制面板进行shell访问)。

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

答案 2 :(得分:-1)

这告诉你你需要知道什么。     请求的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]

代替。