Mod_Rewrite显示子域而不是查询字符串

时间:2013-07-08 11:59:46

标签: apache .htaccess mod-rewrite

我想授予我的每个客户一个子域名,以便他更方便地访问我的应用程序。

例如,我想

joseph.mysite.com/inex.php将显示在地址栏中。 而实际的页面位置是www.mysite.com/index.php?customerId=102

同样的 joseph.mysite.com/personalArena.php => www.mysite.com/personalArena.php?customerId=102

有没有办法根据用户输入的子域将查询字符串附加到域?。

提前致谢, 奥列格。

1 个答案:

答案 0 :(得分:0)

假设您的网站已配置为接受您设置的各种子域(如何配置此功能可能会有所不同,而不是在httpd.conf的ServerAlias部分设置VirtualHost,使用mod_proxy等),然后以下将执行你想要的 part

RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$
RewriteRule (.*)\.php http://www.example.com/$0?cid=%1 [QSA]

基本上它会重写任何.php请求,并添加?cid=X,其中X是域的第一部分...例如:http://john.example.com/test.php变为http://www.example.com/test.php?cid=john 。这一点我测试过,似乎有用(对我而言)。

下一步是将子域映射到用户ID。有多种方法可以做到这一点,但一种简单的方法是使用一个只列出映射的文本文件:

john 123
joseph 102
oleg 179

然后,在httpd.conf(重要 - RewriteMap无法在.htaccess中使用)中,您将其定义为地图:

RewriteMap useridmap txt:/path/to/useridmap.txt

完成此操作后,您可以在规则中使用映射,例如:

RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$
RewriteRule (.*)\.php http://www.example.com/$0?cid=${useridmap:%1} [QSA]

在查询字符串中用“123”替换子域中的“john”,依此类推。

警告:我目前无法尝试,因为我不在服务器上,我可以轻松配置。