.htaccess 通配符子域名路径

.htaccess 通配符子域名路径

我的网站设置如下:

RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteCond %{HTTP_HOST} ([^.]+)\.example\.com [NC]
RewriteRule ^/?$ /user/profile.php?name=%1 [L]

这样做的目的是,如果用户访问:test.example.com,它将显示文件的内容:example.com/user/profile.php?name=test。如果有人访问lol.example.com,它将显示页面:example.com/user/profile.php?name=lol但 URL 将与子域名保持不变,如test.example.comlol.example.com

这部分正在工作。


问题:

如果我转到test.example.com/login,它将显示我的域根文件。我该如何让它显示/user文件夹中的内容?

例如:

  • test.example.com/login会显示example.com/user/logintest.example.com/register会显示,example.com/user/register但是 URL 会与子域名保持相同?

  • test.example.com/pathtofile应该获取 的内容example.com/user/pathtofile。“pathtofile” 应该是动态的。我只希望在文件夹中查找路径/user,而不是根文件夹中查找路径。

答案1

如果有人访问lol.example.com,它将显示页面:example.com/user/profile.php?name=lol

严格来说,它会显示页面:(lol.example.com/user/profile.php?name=lol子域名未被删除)。但由于(我假设)所有子域名和主域名都指向文件系统上的同一位置,因此它可以工作。

test.example.com/pathtofile应该得到的内容example.com/user/pathtofile

您的原始指令仅重写了对文档根目录 ( ) 的请求test.example.com/。要重写/pathtofile,您可以在 中的上述内容后添加另一个规则块.htaccess。例如:

RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteCond %{HTTP_HOST} [^.]+\.example\.com [NC]
RewriteCond %{REQUEST_URI} ^/([^/]+)$
RewriteRule !^user/ /user/%1 [L]

这将重写所有尚未启动/user/且仅由单个(非零长度)路径段组成的请求,如您的示例所示(例如/pathtofile和 不是/path/to/file),并重写为/user/pathtofile

更新:如果您已ErrorDocument定义,则需要尽早在您的 `.htaccess 文件中设置例外,以防止重写错误文档的子请求。例如:

RewriteRule ^404\.php$ - [L]

相关内容