【发布时间】:2011-04-29 18:43:52
【问题描述】:
我即将更新我的网站以使用 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 并将其重定向到 item/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]
这行得通。它将所有 url 汇集到正确形成的 Cake url 中。然后哪个蛋糕的处理器拿起并以某种方式处理。我不确定它是如何错过 Cake 的第二条重写规则的,但确实如此。试试这个:
RewriteRule ^(.*)$ item/172 [R=301]
返回一个格式错误的重定向,就像在前一个上指定 last 一样:
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]
无法匹配或返回正确的 URL。而且它似乎也不符合 Cake 的正常捕获,因为 $_GET['url'] 是空的。如何在 mod_rewrite 中转义参数字符以匹配字面意思?
【问题讨论】:
-
嘎! mod-rewrite 的 *&@$& 有什么问题?我让它工作了大约 30 秒,添加了另一个重写规则,它再次停止工作!我删除了另一个重写规则,但它仍然无法正常工作!到底是什么?!
标签: php cakephp mod-rewrite seo