首页 > 解决方案 > Apache:如何根据用户本地或外部网络设置不同的根文件夹

问题描述

我有一个/Users/username/Sites/用于在本地测试站点的根目录。我只想将其中一个子文件夹公开Users/username/Sites/subsite给来自网络外部的请求。

我已经设置了端口转发,并且在从动态 DNS 服务登录时能够看到根目录。

我必须对 Apache 做些什么才能完成这项工作?我已经尝试了几次搜索,但我似乎无法找到正确的措辞来回答我的问题。

标签: macosapache

解决方案


您可以在服务器配置中创建(或修改)a <VirtualHost>,该配置接受对直接指向的“dynamic-dns-hostname.example”的请求Users/username/Sites/subsite

例如,最低限度是(从现有的 vHost 复制配置):

<VirtualHost *:80>
    ServerName dynamic-dns-hostname.example
    DocumentRoot Users/username/Sites/subsite
    <Directory Users/username/Sites/subsite>
        Options FollowSymLinks
        Require all granted
        AllowOverride All
    </Directory>
</VirtualHost>

这有效地向用户隐藏/subsite目录的名称,因为请求http://dynamic-dns-hostname.example/直接指向子目录。

这只是 HTTP(端口 80)。如果您允许 HTTPS 连接,那么您将需要另一个具有所有 SSL 配置的端口 443(默认)的 vHost。


或者,您可以在访问任何不是本地 IP 地址的 IP时发出外部重定向(或内部重写,如果您想隐藏子目录) 。Users/username/Sites

例如,在您的主 vHost 容器(或<Directory /Users/username/Sites>容器,或.htaccess目录中的/Users/username/Sites/文件)中,您可以执行以下操作:

RewriteEngine On

RewriteCond %{REMOTE_ADDR} !^192\.168\.
RewriteCond %{REQUEST_URI} !^/[^/]+/subsite($|/)
RewriteRule ^/?(.*) /subsite/$1 [R,L]

这假设本地 IP 地址开始192.168.


在旁边:

与其为您创建的每个子站点创建一个新的子目录(在单个 vHost 中),不如为每个子站点创建一个新的 vHost 并将其指向一个单独的目录(不是子目录),这样就不会有重叠。

如果是这种情况,那么只需将ServerAlias指令添加到适当的 vHost 容器即可:

ServerAlias dynamic-dns-hostname.example

推荐阅读