通配符子域.htaccess和Codeigniter

时间:2011-01-08 19:56:18

标签: apache .htaccess codeigniter subdomain wildcard

我正在尝试创建适当的.htaccess,这样我就可以这样映射:

http://domain.com/                --> http://domain.com/home 
http://domain.com/whatever        --> http://domain.com/home/whatever
http://user.domain.com/           --> http://domain.com/user 
http://user.domain.com/whatever   --> http://domain.com/user/whatever/

在这里,有人会输入上述网址,但在内部,它会重定向,就好像它是右边的网址一样。

此外,子域也是动态的(即http://user.domain.com不是实际的子域,但会是.htaccess重写)

此外,/ home是我的默认控制器,因此没有子域会在内部强制它到/ home控制器,其后面的任何路径(如上面的#2示例所示)将是该控制器中的(catch-all)函数。

如果子域名被传递,它将作为一个(catch-all)控制器与任何(catch-all)函数一起传递(如上面的#4示例所示)

希望我在这里要求不多,但我似乎无法找到适当的.htaccess或路由规则(在Codeigniter中)。

httpd.conf和主机设置得很好。

编辑#1

这是我的.htaccess即将结束但在某些时候搞砸了:

RewriteEngine On

RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).domain [NC]
RewriteRule (.*) index.php/%1/$1 [QSA]

RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L,QSA]

有了上述内容,当我访问:http://test.domain/abc/123时,我注意到$ _SERVER var(我删除了一些字段):

Array
(
    [REDIRECT_STATUS] => 200
    [SERVER_NAME] => test.domain
    [REDIRECT_URL] => /abc/123
    [QUERY_STRING] => 
    [REQUEST_URI] => /abc/123
    [SCRIPT_NAME] => /index.php
    [PATH_INFO] => /test/abc/123
    [PATH_TRANSLATED] => redirect:\index.php\test\test\abc\123\abc\123
    [PHP_SELF] => /index.php/test/abc/123
)

你可以看到PATH_TRANSLATED没有正确形成,我认为这可能搞砸了吗?

2 个答案:

答案 0 :(得分:0)

好的,我相信我已经解决了。这是我到目前为止所拥有的。

首先是.htaccess

RewriteEngine On

RewriteBase /

# if REQUEST_URI contains the word "user" and the
# SERVER_NAME doesn't contain a "." re-direct to the root
# The reason this is done is because of how the last two rules
# below are triggered
RewriteCond %{REQUEST_URI} (user) [NC]
RewriteCond %{SERVER_NAME} !\.
RewriteRule (.*) / [L,R=301]

# Allow files and directories to pass
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

# Codeigniter rule for stripping index.php
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [C]

# Force wild-card subdomains to redirect.
# E.g. http://me.domain/foo/bar/123 as http://domain/user/me/index.php/foo/bar/123/bar/123/
RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).domain [NC]
RewriteRule (.*) /index.php/user/%1/$1/ [L]

最后是routes.php

<?php
// Force routing to userhome controller if URL contains the word "user"
// otherwise force everything else to home controller
$route['user/:any'] = "userhome";
$route[':any'] = "home";
?>

从上面可以看出一切正常。我唯一想不通的是为什么在使用子域时会重复最后的参数?

如果我这样做:http://domain/foo/bar/123

然后我的PATH_INFO显示为 / foo / bar / 123 / ,这是完美的

但如果我这样做:http://me.domain/foo/bar/123

然后我的PATH_INFO显示为 /user/me/index.php/foo/bar/123/bar/123 / 大部分都可以,但为什么参数最后会重复?

所以总的来说我觉得它有效。我唯一需要做的就是为我添加到我的\控制器的任何控制器都有几条路径。除非有办法绕过它?

答案 1 :(得分:-1)

这应该有效。请测试并告诉我它是否有效:

RewriteEngine On
RewriteCond   %{HTTP_HOST}              ^[^.]+\.domain\.com$
RewriteRule   ^(.+)                     %{HTTP_HOST}$1        [C]
RewriteRule   ^([^.]+)\.domain\.com(.*) /$1$2                 [L]
RewriteRule   ^(.*)                     /home$1               [L]