Php 通配符子域和CodeIgniter路由

Php 通配符子域和CodeIgniter路由,php,.htaccess,codeigniter,mod-rewrite,url-rewriting,Php,.htaccess,Codeigniter,Mod Rewrite,Url Rewriting,我目前正在使用CodeIgniter3。我想创建动态子域,如team1.domain.com,team2.domain.com,等等 这些域需要指向控制器团队,并特别指向该控制器中的show_团队方法 我在StackOverflow上读过好几篇QA,但似乎没有一篇适合我 目前,我有: RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ ./index.php [L,QSA] RewriteCond %{HTTP_HOST} ^([a-z

我目前正在使用CodeIgniter3。我想创建动态子域,如
team1.domain.com
team2.domain.com
,等等

这些域需要指向控制器
团队
,并特别指向该控制器中的
show_团队
方法

我在StackOverflow上读过好几篇QA,但似乎没有一篇适合我

目前,我有:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ./index.php [L,QSA]

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).domain.com [NC]
RewriteRule (.*) /index.php/team/$1/ [L,QSA]
作为路线:

$route['team/(:any)'] = "Team/show_Team";
但这给了我一个500的内部错误

StackOverflow上发布的几个稍有不同的选项也不起作用

更新 错误日志告诉我:

[Wed Jan 04 09:52:15.013871 2017] [core:error] [pid 4792:tid 1332] (OS 123)The filename, directory name, or volume label syntax is incorrect.  : [client 127.0.0.1:61066] AH00132: file permissions deny server access: proxy:http://team1.domain.com/Team/show_Team/, referer: team1.domain.com/Team/show_Team/
当我将其更新为(如评论中所示)时:

它给了我这个错误:

[Wed Jan 04 10:01:35.959839 2017] [core:error] [pid 4792:tid 1320] [client 127.0.0.1:61351] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: http://team1.domain.com/

试试这个;我通过评论解释:

Options+FollowSymLinks
重新启动发动机
重写基/
#如果不是正在访问的文件
重写cond%{REQUEST_FILENAME}-F
#如果它不是正在访问的目录
重写cond%{REQUEST_FILENAME}-D
#如果是domain.com,有无www(无子域)
重写cond%{HTTP_HOST}^(www\)?domain\.com$
#将所有请求重写为index.php添加查询
#字符串(QSA)并终止所有后续重写
#游行。
#见:https://httpd.apache.org/docs/current/rewrite/flags.html#flag_end 
重写规则^(.*)$/index.php/$1[END,QSA]
#如果不是从www开始的话
重写cond%{HTTP_HOST}^万维网
#并且是子域
重写cond%{HTTP\u HOST}^([a-z0-9-]+)\.domain\.com$[NC]
#将请求重写为index.php/test/SUBDOMAIN/whatever。。。
重写规则^(.*)$/index.php/team/%1/$1[结束,QSA]
##结果:
#domain.com/foo/bar=>/index.php/foo/bar
#www.domain.com/foo/bar=>/index.php/foo/bar
#team1.domain.com/foo/bar=>/index.php/team/team1/foo/bar
#team2.domain.com/foo/bar=>/index.php/team/team2/foo/bar
这里,我假设您希望将
子域作为某种团队标识符传递给控制器方法

那么,你的路线应该是这样的:

$route['team/(.+)'] = "Team/show_Team/$1";
与只匹配一个段的
(:any)
相反,
(.+)
可以匹配多个段
$1
是对
(.+)
捕获内容的反向引用

team/
之后的任何内容都将作为参数传递给控制器方法:

class Team extends CI_Controller {

    // ...

    public function show_Team($team_id, $foo, $bar) {
        // ...    
    }
}

那么,关于内部错误的原因,您的http服务器错误日志文件告诉了您什么?顺便说一句,它应该是
^([a-z0-9-]+)\.domain\.com$
…而且我看不到您在这种情况下实际使用了您注意捕获的主机名。当然,无休止的重定向循环是因为在通过重写引擎的下一次往返中,相同的条件显然也匹配。。。在较新版本的apache上,您可以使用
END
标志而不是
L
标志来防止这种情况,在较旧版本上,您需要一个附加条件。如前所述:您应该对捕获的主机名做一些处理。
([a-z0-9-]+)
中的括号捕获主机名,它后面的文字点之前的字符串。您通常会捕获它,因为您希望以后使用它,否则,为什么要捕获它?通常情况下,一个人会交给另一个GET参数或环境变量。谢谢,我做了一些测试,您的结果是正确的。然而,我现在看到的是重定向到index.php/team/team1,而URL保持不变。在谷歌上进一步搜索后,看起来CodeIgniter无法正确处理这个问题?这与CodeIgniter无关;Apache在请求到达CodeIgniter之前完成所有重写工作。不,它不会重定向请求。那里没有
R
标志。但是,您需要以将所有这些子域解析为应用程序的方式映射这些子域。你可能需要一个。在此之后,您还需要了解通配符子域。我有通配符DNS,但我想宿主必须在@Apache部分做一些事情(如您所建议的)。我会联系他们的。感谢您回复does
team1.domain.com
点击您的CodeIgniter应用程序?是的,现在可以,但是team1.domain.com现在转到domain.com/team/team1(作为routes.php中的路由)。我认为主持人需要在Apache中进行一些更改(如您所说)
class Team extends CI_Controller {

    // ...

    public function show_Team($team_id, $foo, $bar) {
        // ...    
    }
}