【问题标题】:Rewriting problem with .htaccess (removing /index.php from CodeIgniter URLs).htaccess 的重写问题(从 CodeIgniter URL 中删除 /index.php)
【发布时间】:2010-10-27 11:40:36
【问题描述】:

我对我们网站上的一些 .htaccess 规则有一个小问题 - http://www.presencemultimedia.co.uk

我们最近使用 CodeIgniter 重新构建了网站。为了使用漂亮的 URL,我在 .htaccess 文件中添加了一些行,如下所示:

RewriteEngine on

# CodeIgniter rules (forwards requests to index.php)
RewriteCond $1 !^(index\.php|images|robots\.txt|public)
RewriteRule ^(.*)$ /index.php/$1 [L]

# rewrites path to our primary domain (www.presencemultimedia.co.uk)
RewriteCond %{http_host} !www.presencemultimedia.co.uk$
RewriteRule ^(.*)$ http://www.presencemultimedia.co.uk/$1 [r=301,nc]

第二个重写规则旨在确保该域始终是我们的主域 (www.presencemultimedia.co.uk)。

我遇到的问题是,如果网站是由别名域访问的,例如http://www.prmulti.com,URL被改写为主域但在路径中添加/index.php/。

例如 - http://www.prmulti.com/about/ 应该重写为 http://www.presencemultimedia.co.uk/about/ 而不是 http://www.presencemultimedia.co.uk/index.php/about

谁能看出我哪里出错了?

干杯,菲尔

【问题讨论】:

  • 您是否尝试过编辑您的 config.php 文件?您应该从 $config['index_page'] 中删除 index.php

标签: apache .htaccess mod-rewrite codeigniter alias


【解决方案1】:

我对这个配置很幸运:

RewriteEngine on

# rewrites path to our primary domain (www.presencemultimedia.co.uk)
RewriteCond %{http_host} !www.presencemultimedia.co.uk$
RewriteRule ^(.*)$ http://www.presencemultimedia.co.uk/$1 [r=301,nc,l]

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

如果域规则匹配,则重定向(但使其成为最后一条规则)。 然后在正确的域上,如果请求不是现有文件或目录,则传递给 Code Igniter。

【讨论】:

  • 我确实在工作 - 干杯:) 我不得不用 CodeIgniter 行替换最后 2 行 RewriteCond 行:RewriteCond $1 !^(index\.php|images|robots\.txt|public) (排除一些请求被路由到 index.php)干杯!
  • 酷。在单个 (images|public...) 条目给我 500 分之后,我尝试了两个 !-f/!-d 条件(就像我之前使用过的那样) - 不知道为什么。
【解决方案2】:

我原以为 301 重定向应该高于您的 CodeIgniter 规则,给出:

RewriteEngine on

# rewrites path to our primary domain (www.presencemultimedia.co.uk)
RewriteCond %{http_host} !www.presencemultimedia.co.uk$
RewriteRule ^(.*)$ http://www.presencemultimedia.co.uk/$1 [r=301,nc]

# CodeIgniter rules (forwards requests to index.php)
RewriteCond $1 !^(index\.php|images|robots\.txt|public)
RewriteRule ^(.*)$ /index.php/$1 [L]

我最近为网站开发了一个多站点框架,这就是我正在使用的重写顺序:首先是域,然后通过我的index.php 引导结果。对于像 CodeIgniter 这样的现成框架,理论应该是相同的。

【讨论】:

  • 这听起来是对的。观察到的行为符合这个解释。因为请求进入备用域,是 302'd 到 prmulti.com/index.php 然后 301'd 到 presencemultimedia.co.uk/index.php/。您的第一条规则上的 [L] 将确保它是最后一条规则,因此之后不会到达任何内容。
  • 嗯...这会为 www.prmulti.com 返回一个 301(基本上是任何不是 www.presencemultimedia.co.uk 的域)-cl.ly/307e
  • 嗨 Martin - Craig 的代码完成了这项工作。据我所知,与您的唯一主要区别是在第一个重写规则中添加了 L 标志。不知道为什么这会奏效......
  • 我认为这可能是级联问题。虽然满足了第一个条件,但也满足了第二个条件。当在域方向上放置L 标志时,不会向其他人提供该请求;重新开始该过程,其中第一个请求不匹配,但第二个请求匹配。希望这是有道理的!如果我错了,我相信有人会纠正我。
  • 对我来说听起来很合理!再次感谢:)
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2017-03-15
相关资源
最近更新 更多