如何在 Apache 中为用户实现子域名

如何在 Apache 中为用户实现子域名

我正在建立一个平台,主要域名是示例.com。服务器使用 CentOS 7 和 Apache 2。

我的用户的 URL 将是用户名.example.com,它实际上加载了example.com/用户名, 以便:

  • mjohnson.example.com 从 example.com/mjohnson 加载内容
  • mjohnson.example.com/about 从 example.com/mjohnson/about 加载内容
  • jsmith.example.com/ 从 example.com/jsmith/ 加载内容

等等。此设置的最佳方法是什么?我有 httpd.conf 配置文件的完全访问权限。

答案1

对于简单的情况,使用 mod_rewrite 非常简单。

RewriteEngine on
RewriteCond "%{HTTP_HOST}" "^([^.]+)\.example\.com$" [NC,NV]
RewriteRule "^(.*)$" "%{REQUEST_SCHEME}://%{HTTP_HOST}/%1$1" [L]

获得您的第一点是不可能的,因为您永远无法仅请求主机名。
如果您这样输入,则在浏览器或客户端中,它总是会附加 /,因为 HTTP 协议需要从服务器请求一些 URI,而该 URI 不能是空字符串。

根据您的具体要求,它可能会变得更加复杂。

例如,上述解决方案不会转换收到的主机标头的大小写,因此生成的 URI 的用户名大小写与请求者在主机标头中发送的大小写完全相同。
它会忽略 example.com 的大小写,因为默认情况下 DNS 名称不区分大小写。但生成的用户名可能是 MJohnson、Mjohnson 或 mJOHNSON,但主机标头已发送,这些通常是不同的字符串。)
例如,要始终强制将生成的 URL 中的用户名设为小写,您可以将 RewriteCond 行替换为以下内容:

RewriteCond expr "tolower(%{HTTP_HOST}) =~ /^([^.]+)\.example\.com(:\d+)?$/" [NV]

相关内容