我想在网址中映射多个目录:
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重定向,只是内部重写。
答案 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]
代替。