.htaccess mod_重写、子域和codeigniter出现问题
我在example.com/ci上安装了codeigniter。 我有一个子域名foo.example.com。foo子域的文档根被设置为home/public\u html/ci 我在.htaccess中使用以下规则将对foo.example.com的请求发送到example.com/ci/city/foo.htaccess mod_重写、子域和codeigniter出现问题,.htaccess,codeigniter,mod-rewrite,subdomain,.htaccess,Codeigniter,Mod Rewrite,Subdomain,我在example.com/ci上安装了codeigniter。 我有一个子域名foo.example.com。foo子域的文档根被设置为home/public\u html/ci 我在.htaccess中使用以下规则将对foo.example.com的请求发送到example.com/ci/city/foo RewriteCond %{HTTP_HOST} !^(www)\. [NC] RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC] R
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。重写规则中没有R=301(以前是,但我删除了它)。htaccess文件位于ci/文件夹中,规则位于codeigniter的所有内容之上
重定向工作正常,url仍然是foo.example.com(Jon Lin的答案)
但是在城市控制器中调用codeigniter默认控制器,而不是foo方法
如果您的重写规则目标有
http://example.com
在其中,302重定向是隐式的,无论是否使用了R
标志。您需要根据子域的文档根提供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]
当重写规则的目标具有
http://example.com
在其中,302重定向是隐式的,无论是否使用了R
标志。您需要根据子域的文档根提供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]
您的里程数可能会有所不同(可能需要调整它以适应您的服务器和条件),但在我的Mac上进行一些测试,以下是我取得的轻微成功: 目录结构 我假设您的root
public\uhtml
目录中还有其他内容。因此,我将.htaccess放在ci
dir中,让它专注于与CodeIgniter相关的内容
.htaccess
这是不言自明的,但第一块是子域检查。我没有费心排除www
,但您可能想(正如我所说,您的里程数可能会有所不同)。第二个块是标准的CodeIgniterindex.php
removation
这些规则只适用于sub.example.com
或example.com/ci/
URL,因为正如我所说的,我假设您的根目录中有不应该被重写干扰的内容
代码点火器配置
由于Apache处理像example.com/index.php/controller/method
这样的URL的方式,它绕过了index.php
,并像处理任何其他目录段一样处理它。此外,mod_rewrite不一定在[L]
标记处停止——它在该点停止处理.htaccess,通过RewriteRule,然后通过.htaccess运行该URL。设置PATH\u INFO
有助于确保CodeIgniter正确提取当前URI,并且我们的.htaccess不会陷入验证循环
不过,我会注意到,我对我在RewriteLog输出中看到的并不完全满意——必须有一种方法来进一步优化它,我只是还不确定(我今天已经完成了修补!)。抱歉,如果这里的任何解释有点不正常的话-我不是服务器管理员或mod_重写专家,我只是从修补中得到了乐趣。如果我能找到更好的解决方案,我一定会更新这个
看起来它非常适合这种情况(防止
[L]
循环),但它仅在Apache 2.3.9+中可用。搜索仍在继续。您的里程数可能会有所不同(可能需要调整以适应您的服务器和条件),但在我的Mac电脑上进行一些测试时,我取得了一些轻微的成功:
目录结构
我假设您的rootpublic\uhtml
目录中还有其他内容。因此,我将.htaccess放在ci
dir中,让它专注于与CodeIgniter相关的内容
.htaccess
这是不言自明的,但第一块是子域检查。我没有费心排除www
,但您可能想(正如我所说,您的里程数可能会有所不同)。第二个块是标准的CodeIgniterindex.php
removation
这些规则只适用于sub.example.com
或example.com/ci/
URL,因为正如我所说的,我假设您的根目录中有不应该被重写干扰的内容
代码点火器配置
由于Apache处理像example.com/index.php/controller/method
这样的URL的方式,它绕过了index.php
,并像处理任何其他目录段一样处理它。此外,mod_rewrite不一定在[L]
标记处停止——它在该点停止处理.htaccess,通过RewriteRule,然后通过.htaccess运行该URL。设置PATH\u INFO
有助于确保CodeIgniter正确提取当前URI,并且我们的.htaccess不会陷入验证循环
不过,我会注意到,我对我在RewriteLog输出中看到的并不完全满意——必须有一种方法来进一步优化它,我只是还不确定(我今天已经完成了修补!)。抱歉,如果这里的任何解释有点不正常的话-我不是服务器管理员或mod_重写专家,我只是从修补中得到了乐趣。如果我能找到更好的解决方案,我一定会更新这个
看起来它非常适合这种情况(防止
[L]
循环),但它仅在Apache 2.3.9+中可用。搜索继续。我使用以下重写规则使其正常工作
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配置文件中。谢谢你的帮助
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';
<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>