2017-05-05 115 views
2

我试图实现,使用.htaccess,所以我可以访问所有我的项目与一个虚拟主机设置,并在主机文件中定义一个URL的配置。这将允许我在该文件夹中放置一个项目,它将起作用而不需要我做任何其他配置,并在工作时节省大量时间。动态加载子域文件夹作为根用.htaccess

实施例A:prestige.projects.dev托管在D:/projects/prestige

实施例B:newproject.projects.dev托管在D:/projects/newproject

下面的代码适用于实施例A的具体情况,但我不了解如何使所有项目“动态”工作。我的目标是使prestige成为通配符。例如:newproject.projects.dev应该自动加载D:/projects/newproject的内容。

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^prestige\.projects\.dev$ 
RewriteCond %{REQUEST_URI} !^/prestige/ 
RewriteRule (.*) /prestige/$1 

只要达到目标,我愿意接受其他建议而不是此方法。

回答

2

试着这么做,而不是执行以下操作:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^([a-z]+)\.projects\.dev [NC] 
RewriteCond "%{REQUEST_URI} /%1" !^(/[^/]+)[^\s]*\s\1$ 
RewriteRule (.*) /%1/$1 [L] 

%1是一个反向引用捕获的组中最后一个匹配CondPattern

第二个RewriteCond指令是硬编码检查的“通配符”版本,以确保REQUEST_URI尚未以与子域相匹配的目录开始 - 从而防止重写循环。

%{REQUEST_URI} /%1(其扩展为第一重写后的形式是“/<directory>/<anything> /<subdomain>”的字符串)被针对正则表达式^(/[^/]+)[^\s]*\s\1$,它检查以查看是否/<directory>匹配的字符串相同/<subdomain\1是内部反向引用到在正则表达式中捕获的组)。只有当这不匹配时,RewriteRule替代才会发生 - 与您当前的规则工作方式相同。

+0

如果'%{DOCUMENT_ROOT} /%1'是一个目录,那么可以添加一个检查。 –

+0

我已经更新了我的答案。现在这更接近地模仿你对'REQUEST_URI'的检查,从而避免直接请求重写子域/目录(这不需要“REDIRECT_STATUS”检查)。这仍然允许直接访问该目录 - 尽管如果该环境仅用于开发(如果需要,可以实现_外部重定向),这应该不成问题。 – MrWhite

+0

我还没有实现Olaf建议的目录检查,因为我认为这会比404更糟糕,而不是默默无闻。除非访问文档根(子域)时的默认响应是404响应? – MrWhite