You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现子域名账户重定向至子文件夹并保持URL不变的内部映射

实现子域名映射到内部页面且保持URL不变的方案

这需求我之前帮朋友落地过,核心靠服务器重写规则+PHP内部处理配合就能搞定,既可以捕获子域名作为查询参数,又能让用户看到的URL完全保持子域名形式,具体步骤如下:

第一步:先搞定DNS泛域名解析

首先得确保你的域名服务商支持泛域名解析,把*.domain.com.xyz指向你的服务器IP。这样所有形如xxx.domain.com.xyz的子域名请求都会打到你的服务器上,这是实现这个需求的基础前提。

第二步:服务器配置(Nginx/Apache二选一)

Nginx配置

在你的站点配置块里添加重写规则,把所有子域名请求内部转发到userpage.php,同时把捕获到的子域名作为id参数传递:

server {
    listen 443 ssl;
    server_name *.domain.com.xyz;

    # SSL证书配置(按你现有配置保留即可)

    root /path/to/your/webroot;
    index index.php;

    location / {
        # 捕获子域名(排除主域名本身的访问请求)
        if ($host ~* "^(.+)\.domain\.com\.xyz$") {
            set $subdomain $1;
            # 内部转发到userpage.php,传递id参数,URL保持不变
            rewrite ^/(.*)$ /userpage.php?id=$subdomain last;
        }
        # 主域名访问时走正常逻辑
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP处理配置(按你现有FastCGI配置保留即可)
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Apache配置

如果用Apache的话,先确保启用了mod_rewrite模块,然后在.htaccess或者虚拟主机配置里添加规则:

RewriteEngine On
# 捕获子域名,排除主域名访问场景
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com\.xyz$ [NC]
# 内部转发到userpage.php,传递id参数,URL保持不变
RewriteRule ^(.*)$ /userpage.php?id=%1 [L,QSA]

这里的[L]表示停止后续规则执行,[QSA]表示保留原有查询参数(如果用户访问时带了额外参数的话)。

第三步:PHP处理逻辑

在userpage.php里,你可以直接获取服务器传递过来的id参数(也就是捕获到的子域名),然后查询数据库并展示对应的用户内容:

<?php
// 获取子域名对应的用户ID
$userId = $_GET['id'] ?? '';

// 先验证ID合法性(一定要做,防止SQL注入和非法请求)
if (preg_match('/^[a-zA-Z0-9_-]+$/', $userId)) {
    // 用PDO方式查询数据库(推荐用预处理语句防注入)
    $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'db_user', 'db_pass');
    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
    $stmt->execute([$userId]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user) {
        // 展示用户页面内容
        echo "<h1>欢迎回来,{$user['username']}!</h1>";
        // 这里可以添加更多用户信息展示逻辑
    } else {
        // 用户不存在时的处理
        echo "<h1>该用户不存在</h1>";
    }
} else {
    // 非法ID的处理
    echo "<h1>无效的访问地址</h1>";
}
?>

关键说明

  • 这种方式是内部转发,用户浏览器的URL完全不会改变,始终显示https://kelly.domain.com.xyz这样的形式;
  • 一定要做参数合法性校验和SQL注入防护,绝对不能直接把$_GET['id']代入数据库查询;
  • 如果你的子域名可能包含特殊字符,需要调整正则表达式或者提前做URL解码处理。

内容的提问来源于stack exchange,提问作者Kelly O'blair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:55:45