【问题标题】:Dynamically load subdomains folder as root with .htaccess使用 .htaccess 以 root 身份动态加载子域文件夹
【发布时间】:2017-10-04 03:27:36
【问题描述】:

我正在尝试使用.htaccess 来实现,因此我可以使用一个虚拟主机设置和一个在主机文件中定义的 URL 的配置来访问我的所有项目。这将允许我将一个项目放入文件夹中,它无需我进行任何其他配置即可运行,并在工作时节省大量时间。

示例 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

我愿意接受除此方法之外的其他建议,只要达到目标即可。

【问题讨论】:

    标签: .htaccess mod-rewrite subdomain


    【解决方案1】:

    请尝试以下方法:

    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>是否与@987654329相同@(\1 是对正则表达式中捕获组的内部反向引用)。只有当这不匹配时,才会发生RewriteRule 替换 - 与您当前规则的工作方式相同。

    【讨论】:

    • 如果%{DOCUMENT_ROOT}/%1 是一个目录,可以添加一个检查。
    • 我已经更新了我的答案。这现在更接近地模仿您对REQUEST_URI 的检查,从而防止对子域/目录的直接请求被重写(这消除了对REDIRECT_STATUS 检查的需要)。这仍然允许直接访问目录 - 尽管如果此环境仅用于开发,这应该不是问题(如果需要,可以实现 外部重定向)。
    • 我没有实现 Olaf 建议的目录检查,因为我认为最好以 404 失败而不是静默失败。除非访问(子域的)文档根目录时的默认响应是 404 响应?
    • 这个解决方案正是我一直在寻找的,检查目录确实不一定,因为 404 是预期的结果。谢谢!
    猜你喜欢
    • 2012-06-19
    • 2017-04-18
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多