考虑以下目录结构,该目录由URL sample.com
下的apache webserver提供:
/local/path/index.html
/local/path/.htaccess
/local/path/admin
/local/path/admin/.htaccess
/local/path/admin/projects/project1/index.html
/local/path/admin/projects/project2/index.html
/local/path/admin/projects/project3/index.html
而/local/path/projects
是指向其他目录的符号链接。
因此/local/path/.htaccess
的内容基本上就是这个规则:
Options SymLinksIfOwnerMatch
另一个.htaccess确保admin目录受密码保护。
请求http://sample.com
时,index.html
已投放。
例如,在用户输入正确的密码后,请求http://sample.com/admin/projects/project1
,/local/path/admin/projects/project1/index.html
的内容。
当然,请求http://sample.com/admin
会导致404错误。
我的目的是让地址http://sample.com/admin
服务/local/path/admin/projects/project1/index.html
。但这应该是重定向,意味着例如在浏览器url-bar中,url仍然是所选择的url。但是,如果有必要,重定向到http://sample.com/admin/
就可以了。
我尝试使用以下内容增强/local/path/admin/.htaccess
文件:
RewriteEngine On
RewriteRule ^admin admin/projects/project1
RewriteRule ^admin/(.*) admin/projects/project1/$1
但规则似乎没有效果。是因为它指向密码保护区吗?
另一方面,无法在admin/.htaccess
内创建规则,如下所示:
RewriteRule ^(.*)$ projects/project1/$1
我在这里做错了什么?
答案 0 :(得分:0)
在/local/path/admin/.htaccess
:
RewriteEngine On
RewriteRule ^/?$ /admin/projects/project1/index.html [L]
RewriteRule ^(?!projects/project1/).+$ /admin/projects/project1/$0 [L,NC]
答案 1 :(得分:0)
我建议您更好地查看文档here:
在
.htaccess
文件中使用重写引擎时,每个目录 prefix(即,指向包含目录的URI路径).htaccess
会自动删除此RewriteRule
文件) 模式匹配并在任何相对之后自动添加(不是 以斜杠或协议名称开头)替换遇到了 规则集的结尾。有关更多信息,请参阅RewriteBase指令 关于将什么前缀添加回相对替换。
再次:
删除的前缀始终以斜杠结尾,表示匹配 针对从不具有前导斜杠的字符串发生。因此,一个 带有 ^ / 的模式在每个目录上下文中永远不会匹配。
因此,如果自动删除了每个目录的前缀,那么在编写admin
时,应该尝试不带/local/path/admin/.htaccess
前缀的重写规则。