重定向/ .htaccess将旧的PHP参数URL更改为SEO友好的CakePHP URL?

时间:2010-10-24 08:08:49

标签: php cakephp mod-rewrite seo

我即将更新我的网站以使用CakePHP而不是旧的本土框架。我需要编写HTAccess文件来将旧的PHP参数URL重定向到新的CakePHP SEO友好URL,但我无法让它工作。

我的htacess文件(app / webroot中的文件)目前看起来像这样:

RewriteEngine On

RewriteRule ^index.php?action=view&item=172$ index.php?url=item/172 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

它不起作用。我尝试删除L并将其重定向到项目/ 172,但这也无效。最新的URL参数未设置,如果我查看$ _SERVER ['REQUEST_URI']则不变。虽然我不知道mod_rewrite是否会改变它。我的重写规则似乎没有激活,即使它直接从我的浏览器的URL栏复制。我试了一下,没有领先/。没有骰子。

这里发生了什么?

如何编写更通用的URL来进行转换?我试过像:

RewriteRule ^index.php?action=view&item=([0-9]+)$ index.php?url=items/$1 [R=301,L]    

但这也不起作用。我做错了什么?

编辑这是令人愤怒的。

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301]

有效。它将所有网址汇集到正确形成的蛋糕网址中。然后哪个蛋糕的处理器拿起并以某种方式处理。我不确定它是如何错过Cake的第二次重写规则,但它确实如此。试试这个:

RewriteRule ^(.*)$ item/172 [R=301]

返回格式错误的重定向,与前一个重定向的最后一个一样:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301,L]

宣称它永远无法完成。

所以我真的很困惑为什么这个:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301]

返回正确的Cake url,但确实如此,并将其发送到正确的页面。然而, 一旦我尝试更改第一部分,它就会开始失败。

等一下。当它碰到?它开始失败时。它成功匹配index.php但不匹配index.php?但是转发它没有任何区别。

RewriteRule ^index.php\?$ /index.php?url=item/172 [R=301]

无法匹配或返回正确的网址。而且它似乎也不匹配Cake的正常捕获,因为$_GET['url']是空的。如何在mod_rewrite中将参数字符转义为字面匹配?

1 个答案:

答案 0 :(得分:4)

使用RewriteRule,您只能测试URI路径,但不能测试查询:

  

Pattern 最初将匹配主机名和端口之后以及查询字符串之前的URL部分。如果您希望与主机名,端口或查询字符串匹配,请分别使用RewriteCond%{HTTP_HOST}%{SERVER_PORT}变量。

所以:

%{QUERY_STRING}