2008-12-18 75 views
0

我想将使用原始URL请求的旧站点的URL重定向到我在CodeIgniter中实现的新站点。我只是想将它们重定向到我的索引页面。我也想摆脱我的URL中的“index.php”,这样我的URL就可以像example.com/this/that一样简单。所以,这是.htaccess文件我已经创建:为什么Apache mod_rewrite没有像预期的那样运行

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页面未找到错误。我已经找到了一种解决方法,将其作为内部重定向,但我真的很喜欢它是外部的。

下一个问题,以及令我莫名其妙的问题是第三条规则。我希望这可以做到以下几点。如果我输入:

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 

如果我在如http://example.com/other/thing网址类别,那么它会去http://example.com/index.php/this/thing不如预期,但如果我输入http://example.com/this/thinghttp://example.com/(我的索引页)。我无法让头或尾巴出来。任何帮助将不胜感激。

回答

1

这应该解决您的index.php的问题,它会简单地检测,如果一个robots.txt可用:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
+0

嗯 - 这似乎也不起作用。问题是我的URL并不是真的要求文件名或目录。例如:example.com/index.php/this/thing应该调用'this'控制器的'thing'方法。 – 2008-12-19 06:54:07

1

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

的条件是:如果请求不是一个文件,而不是一个目录,所以这是正确的,你应该做的是结合请求字符串的追加:

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