Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess mod_重写、子域和codeigniter出现问题_.htaccess_Codeigniter_Mod Rewrite_Subdomain - Fatal编程技术网

.htaccess mod_重写、子域和codeigniter出现问题

.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

我在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]
 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
,但您可能想(正如我所说,您的里程数可能会有所不同)。第二个块是标准的CodeIgniter
index.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电脑上进行一些测试时,我取得了一些轻微的成功:

目录结构 我假设您的root
public\uhtml
目录中还有其他内容。因此,我将.htaccess放在
ci
dir中,让它专注于与CodeIgniter相关的内容

.htaccess 这是不言自明的,但第一块是子域检查。我没有费心排除
www
,但您可能想(正如我所说,您的里程数可能会有所不同)。第二个块是标准的CodeIgniter
index.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>