我有一个在多个站点之间共享的webhost,目录布局如下所示:
siteA/
- css/
- js/
- index.php
siteB/
- css/
- js/
- index.php
siteC/
.
.
.
DocumentRoot位于顶层,因此,要访问siteA,请在浏览器中键入http://webhost/siteA,要访问siteB,请键入http://webhost/siteB, 等等。
现在我必须部署我自己的网站,其设计考虑了3个VirtualHosts,所以我的结构如下:
siteD/
- sites/sitename.com/
- log/
- htdocs/
- index.php
- sites/static.sitename.com
- log/
- htdocs/
- css
- js
- sites/admin.sitename.com
- log/
- htdocs/
- index.php
如您所见,问题是我的index.php文件不在顶级目录中,与webhost上已有的站点不同。 每个VirtualHost都应指向相应的htdocs /文件夹:
http://siteD.com -> siteD/sites/sitename.com/htdocs
http://static.siteD.com -> siteD/sites/static.sitename.com/htdocs
http://admin.siteD.com -> siteD/sites/admin.sitename.com/htdocs
我不能在这台主机上安装VirtualHosts,所以我必须以某种方式模拟它,可能使用mod_rewrite。
在网站的所有链接中都有一些预定义的部分,我可以识别,并使用mod_rewrite相应地路由到正确的文件。
示例:
http://webhost/siteD/static/js/something.js -> siteD/sites/static.sitename.com/htdocs/js/something.js
http://webhost/siteD/static/css/something.css -> siteD/sites/static.sitename.com/htdocs/css/something.css
http://webhost/siteD/admin/something -> siteD/sites/admin.sitename.com/htdocs/index.php
http://webhost/siteD/admin/sub/something -> siteD/sites/admin.sitename.com/htdocs/index.php
http://webhost/siteD/something -> siteD/sites/sitename.com/htdocs/index.php
http://webhost/siteD/sub/something -> siteD/sites/sitename.com/htdocs/index.php
任何以http://url/sitename/admin/(。*)开头的内容都会被重写,指向siteD / sites / admin.sitename.com / htdocs / index.php
任何以http://url/sitename/static/(。*)开头的内容都会被重写,指向siteD / sites / static.sitename.com / htdocs / $ 1
任何以http://url/sitename/(。*) AND 开头的内容都没有从上面开始匹配,将被重写为指向siteD / sites / sitename.com / htdocs / index .PHP
这是我提出的.htaccess文件:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/siteD/static/(.*)$ [NC]
RewriteRule ^siteD/static/(.*)$ siteD/sites/static/htdocs/$1 [L]
RewriteCond %{REQUEST_URI} ^/siteD/admin/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/admin/htdocs/index.php [L,QSA]
到目前为止,这么好。一切正常。现在添加最后一条规则:
RewriteCond %{REQUEST_URI} ^/siteD/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/public/htdocs/index.php [L,QSA]
它已经坏了。最后一条规则捕获所有内容,甚至包含static /或admin /中的内容。 为什么?在前两种情况下,[L]标志是否应该停止重写过程?为什么评估第三种情况?
有更好的解决方法吗?我不是坚持使用rewritemod,只要它不需要访问服务器级配置就可以了。
我无法访问RewriteLog或类似内容。 请帮忙:(
答案 0 :(得分:1)
这很奇怪,但您可以在最后一个模式中添加其他条件,即如果与之前的模式不匹配则使用它:
RewriteCond %{REQUEST_URI} !^/siteD/static/(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/siteD/admin/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/public/htdocs/index.php [L,QSA]