mod_rewrite:子域到控制器

Posted

技术标签:

【中文标题】mod_rewrite:子域到控制器【英文标题】:mod_rewrite: subdomain to controller 【发布时间】:2011-10-11 18:45:13 【问题描述】:

所以我有mydomain.tldwww.mydomain.tldres.mydomain.tld 都指向同一个目录:/var/www/mydomain。在那个目录中,有我的 codeigniter 应用程序。

所以我要做的是将所有通过res.mydomain.tld 发出的请求转发到一个名为resources 的特定控制器。

我有什么:

RewriteCond %HTTP_HOST ^res\.mydomain\.tld$
RewriteRule ^(.*)$ /index.php?/resources/$1 [L]

这会产生服务器错误,我的重写日志没有提供任何关于原因的线索;它只是显示了一些非常奇怪的逻辑应用于请求字符串。

知道为什么这不起作用吗?

【问题讨论】:

什么样的服务器错误,apache错误页面的500内部服务器错误? 如果您没有从重写日志中获得有用的信息,错误日志会说什么? 哈克雷:是的。 Michael:只是请求超出了 10 个内部重定向的限制。 【参考方案1】:

保留您之前的 .htaccess。

在你的 routes.php 中

if($_SERVER["SERVER_NAME"]=="res.mydomain.tld")
    $route['default_controller'] = "resources";
else
    //$route['default_controller'] = Your default controller...

【讨论】:

【参考方案2】:

您创建了一个无限循环。它不断地重写,因为规则总是匹配,并且再次匹配。只需在规则上方添加如下规则即可

RewriteRule ^index.php - [L]

如果(已经重写的)url 以 index.php 开头,这将阻止其下的任何剩余规则执行

【讨论】:

【参考方案3】:

确保index.php 不匹配并进入重写循环:

RewriteCond %REQUEST_URI !^index\.php
RewriteCond %HTTP_HOST ^res\.mydomain\.tld$
RewriteRule ^(.*)$ /index.php?/resources/$1 [L]

【讨论】:

但是 [L] 标志不应该避免进一步重写同一个请求吗? @Tom,不,因为它不是正在处理的另一个规则。在重定向到 index.php 之后,相同的规则再次匹配并且重定向再次发生。 (一次又一次) [L] 阻止应用当前规则下的规则。但是在完成并且重写了 url 之后,它会再次为新的 url 启动整个过程。

以上是关于mod_rewrite:子域到控制器的主要内容,如果未能解决你的问题,请参考以下文章

htaccess Mod_Rewrite 从主域到子域

使用 Apache mod_rewrite 相关问题的子域到文件夹

Mod_rewrite 和 $_GET 变量

如何使用子域链接子目录? (虚拟主机、mod_rewrite、htaccess、DNS)

Apache / mod_rewrite:更改 TLD,但保留子域、协议和查询字符串

mod_rewrite 还是 mod_alias?