我即将更新我的网站以使用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中将参数字符转义为字面匹配?
答案 0 :(得分:4)
使用RewriteRule
,您只能测试URI路径,但不能测试查询:
Pattern 最初将匹配主机名和端口之后以及查询字符串之前的URL部分。如果您希望与主机名,端口或查询字符串匹配,请分别使用
RewriteCond
,%{HTTP_HOST}
或%{SERVER_PORT}
变量。
所以:
%{QUERY_STRING}