htaccess - 具有隐藏参数的所有子域到一个目录

时间:2017-05-08 22:48:02

标签: php apache .htaccess mod-rewrite

我正在创建一个简单的内容管理系统。我的目标是在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]

1 个答案:

答案 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指令确保不会路由静态资源。