为什么Apache mod_rewrite的行为不符合预期

时间:2008-12-18 05:43:01

标签: apache url mod-rewrite codeigniter

我想将URL从使用原始URL请求的旧网站重定向到我在CodeIgniter中实现的新网站。我只是想将它们重定向到我的索引页面。我还想在我的网址中删除“index.php”,以便我的网址可以像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页面未找到错误,而是重定向到我的索引页面。我已经通过将其作为内部重定向找到了解决方法,但我真的希望它是外部的。

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

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/thing它会转到http://example.com/(我的索引页面)。我无法做出正面或反面。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这应解决你的index.php问题,它只会检测robots.txt是否可用:

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

答案 1 :(得分:1)

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

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

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