为什么Apache mod_rewrite没有像预期的那样运行
我想将使用原始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/thing
去http://example.com/
(我的索引页)。我无法让头或尾巴出来。任何帮助将不胜感激。
这应该解决您的index.php的问题,它会简单地检测,如果一个robots.txt可用:
RewriteEngine On
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
嗯 - 这似乎并没有任何工作。问题是我的URL并不是真的要求文件名或目录。例如:example.com/index.php/this/thing应该调用'this'控制器的'thing'方法。 - 史蒂芬斯
的条件是:如果请求不是一个文件,而不是一个目录,所以这是正确的,你应该做的是结合请求字符串的追加:
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
嗯 - 这似乎也不起作用。问题是我的URL并不是真的要求文件名或目录。例如:example.com/index.php/this/thing应该调用'this'控制器的'thing'方法。 – 2008-12-19 06:54:07