0

我想将使用原始 URL 请求的旧站点的 URL 重定向到我在 CodeIgniter 中实现的新站点。我只是想将它们重定向到我的索引页面。我还想在我的 URL 中去掉“index.php”,这样我的 URL 就可以像 example.com/this/that 一样简单。所以,这是.htaccess我创建的文件:

RewriteEngine on
Options FollowSymLinks

RewriteBase /

RewriteCond $1 ^assets
RewriteRule ^(.*)$ example/production/$1

RewriteCond %{QUERY_STRING} .+
RewriteRule ^(.*)$ index.php? [R=301]

RewriteCond $1  !^(index\.php|example|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 

还应该注意的是,我的 index.php 实际上是指向example/production/index.php.

现在,第一个规则按预期工作 - 我所有的样式和图像都显示得很好,这是我遇到问题的后两个规则。第二条规则基本上是销毁查询字符串并重定向到我的索引页面(外部)。所以,我在 Apache 手册中找到了这个:

注意:查询字符串

模式不会与查询字符串匹配。相反,您必须使用带有 %{QUERY_STRING} 变量的 RewriteCond。但是,您可以在包含查询字符串部分的替换字符串中创建 URL。只需在替换字符串中使用问号,即可指示应将以下文本重新注入到查询字符串中。当您想删除现有的查询字符串时,只用问号结束替换字符串。要将新查询字符串与旧查询字符串组合,请使用 [QSA] 标志。

但是,当我尝试访问其中一个旧页面时,我没有重定向到我的索引页面,而是收到 404 page not found 错误。我已经通过将其设置为内部重定向找到了一种解决方法,但我真的希望它是外部的。

下一个问题,也是最让我困惑的一个问题是第三条规则。我希望这会做类似以下的事情。如果我输入:

http://example.com/this/thing

我希望它重新路由到

http://example.com/index.php/this/thing

不幸的是,这不起作用。相反,无论我输入什么,它总是路由到我的索引页面,就好像 URL 中没有其他内容一样(它只是转到http://example.com/)。

此外,如果我用以下内容替换该规则,我会更加困惑:

RewriteCond $1 !^(index\.php|example|robots\.txt)
RewriteRule ^(.*)$ index.php/this/thing

如果我输入一个 URL,例如http://example.com/other/thing,那么它会http://example.com/index.php/this/thing按预期转到,但是如果我输入http://example.com/this/thing它会转到http://example.com/(我的索引页)。我无法从中做出正面或反面。任何帮助将不胜感激。

4

2 回答 2

1

嗯 - 这似乎也不起作用。问题是我的 URL 并没有真正要求文件名或目录。例如:example.com/index.php/this/thing 应该调用 'this' 控制器的 'thing' 方法。——史蒂文·奥克斯利

条件是:如果请求不是文件而不是目录,那么这是正确的,你应该做的是结合请求字符串的附加:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
于 2009-06-18T10:22:04.657 回答
1

这应该可以解决您的 index.php 问题,它会简单地检测 robots.txt 是否可用:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
于 2008-12-18T08:49:32.690 回答