我正在创建一个简单的内容管理系统。我的目标是在user.example.com上设置用户的网站,并在user.example.com/subpage上显示他们的子页面,而无需为每个用户编写文件。最后,我希望获得子域和目录作为POST参数(或读取URL并解析它),并基于此从数据库中获取数据。
我在Ubuntu 14.04上使用LAMP堆栈。 mod_rewrite已启用,以下.htaccess会产生ERR_NAME_NOT_RESOLVED
错误。
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://example.com/ [L,NC,P]
答案 0 :(得分:0)
提供所有子域指向与主域相同的文件系统区域,然后您不必在路由URL方面做任何特别奇特的事情。您不需要“重定向”回主域,因为您已经位于文件系统的正确区域。
然后你可以实现一个相当标准的前端控制器模式。最基本的形式:
FallbackResource /index.php
然后,在index.php
中,您可以检查$_SERVER['HTTP_HOST']
以获取子域(用户)和$_SERVER['REQUEST_URI']
以获取URL路径(以及查询字符串)。
或者,您可以明确地将子域传递给控制器(但实际上并不需要这样做,除非您出于某种原因需要预先验证它)。例如,使用mod_rewrite:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com [NC]
RewriteRule ^ index.php?user=%1 [L]
此处,%1
是对前面RewriteCond
指令中匹配的子域的反向引用。前两个RewriteCond
指令确保不会路由静态资源。