1

我在 example.com/ci 上安装了 codeigniter。我有一个子域 foo.example.com。foo 子域的文档根设置为 home/public_html/ci。

我在 .htaccess 中使用以下规则将 foo.example.com 的请求发送到 example.com/ci/city/foo。

 RewriteCond %{HTTP_HOST} !^(www)\. [NC]
 RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
 RewriteRule (.*) http://example.com/ci/city/%1/$1 [L]

除了地址栏 url 从 foo.example.com 更改为 example.com/ci/city/foo 之外,这一切都像我想要的那样工作。我希望它保留 foo.example.com。RewriteRule 中没有 R=301(曾经是,但我删除了它)。.htaccess 文件位于 ci/ 文件夹中,规则首先是 codeigniter 的东西。

重定向完美无缺,网址仍然是 foo.example.com (Jon Lin 的回答)

RewriteCond %{HTTP_HOST} !^(www)\. [NC]
 RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
 RewriteCond %{REQUEST_URI} !/city/
 RewriteRule (.*) /city/%1/$1 [L]

但是调用 codeigniter 默认控制器而不是城市控制器中的 foo 方法。

任何帮助表示赞赏。

4

4 回答 4

2

当您的重写规则的目标中有一个http://example.com时,无论是否使用R标志,302 重定向都是隐式的。您需要提供基于子域的文档根的 URI 路径,所以我假设您想要类似的东西:

RewriteCond %{HTTP_HOST} !^(www)\. [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
RewriteCond %{REQUEST_URI} !/city/
RewriteRule (.*) /city/%1/$1 [L]

如果子域的文档根目录在/ci/目录中。

另一种选择是使用P标志来反向代理请求:

RewriteCond %{HTTP_HOST} !^(www)\. [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
RewriteRule (.*) http://example.com/ci/city/%1/$1 [L,P]
于 2013-04-12T04:51:56.180 回答
1

我使用以下重写规则使其正常工作

   RewriteCond %{HTTP_HOST} !^(www)\. [NC]
 RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
 RewriteCond %{REQUEST_URI} !/city/
 RewriteRule (.*) /city/%1/$1 [L]

并通过设置

$config['uri_protocol'] = 'ORIG_PATH_INFO';

在 codeigniter 配置文件中。感谢所有的帮助。

于 2013-04-12T17:32:16.670 回答
1

您的里程可能会因此而有所不同(可能需要对其进行微调以适应您的服务器和条件),但是在我的 Mac 上进行一些测试,这就是我取得了轻微成功的原因:

目录结构

public_html/
  ci/
    application/
    system/
    .htaccess
    index.php

我假设你的根public_html目录中有其他东西。所以我让 .htaccess 专注于与 CodeIgniter 相关的东西,方法是将其留在ci目录中。

.htaccess

DirectoryIndex index.php

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(.*)\.ciwildsub\.dev [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/city/%1/$1 [L,QSA]

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

这是相当不言自明的,但第一个块是您的子域检查。我没有打扰排除www,但您可能想要(正如我所说,您的里程可能会有所不同)。第二个块是标准的 CodeIgniterindex.php删除。

这些规则仅适用于sub.example.comexample.com/ci/URL,因为正如我所说,我假设您的根目录包含不应被重写干扰的内容。

CodeIgniter 配置

$config['uri_protocol'] = 'PATH_INFO';

由于 Apache 处理类似 的 URL 的方式example.com/index.php/controller/method,它绕过index.php并像处理任何其他目录段一样处理它。此外,mod_rewrite 不一定在标记处停止[L]——它在该点停止处理 .htaccess,通过 RewriteRule,然后通过 .htaccess 运行该 URL。设置PATH_INFO有助于确保 CodeIgniter 正确提取当前 URI,并且我们的 .htaccess 不会卡在验证循环中。

不过,我会注意到,我对我在 RewriteLog 输出中看到的内容并不完全满意——必须一种方法来进一步优化它,我只是还不确定(我已经完成了修补这是今天的!)。抱歉,如果这里的任何解释有点不合时宜 - 我不是服务器管理员或 mod_rewrite 专家,我只是在修补这个方面很开心。如果我设法找到更好的解决方案,我一定会更新它。


看起来该END标志非常适合这种情况(以防止[L]循环),但它仅在 Apache 2.3.9+ 中可用。搜索继续。

于 2013-04-12T09:30:41.223 回答
0

这对我有用

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /file_path/to/subdomain
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    RewriteCond %{REQUEST_URI} ^application.*
        RewriteRule ^(.*)$ /index.php?/$1 [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php?/$1 [L]
    </IfModule>

    <IfModule !mod_rewrite.c>
        ErrorDocument 404 /index.php
    </IfModule> 
于 2014-06-04T14:45:15.283 回答