Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CakePHP在.htaccess中重写规则_Cakephp_Mod Rewrite_Routes - Fatal编程技术网

使用CakePHP在.htaccess中重写规则

使用CakePHP在.htaccess中重写规则,cakephp,mod-rewrite,routes,Cakephp,Mod Rewrite,Routes,我做了很多搜索,做了一些教程,我想我知道它应该如何工作,但它不起作用。有人知道CakePHP中的重写规则是怎么回事吗?它有“问题”吗 顺便说一句,我开始尝试使用Router::connect,但也无法实现。我很乐意接受任何一种解决方案 目标是:将我笨拙的旧查询字符串(?action=show&id=3)路由或重定向到groovy CakePHP URL(/show/3),例如,一旦我完成切换到Cake,人们现有的书签仍然可以使用。我真正需要捕获的是id=bit中的数字 以下是我最近一次尝试重写规

我做了很多搜索,做了一些教程,我想我知道它应该如何工作,但它不起作用。有人知道CakePHP中的重写规则是怎么回事吗?它有“问题”吗

顺便说一句,我开始尝试使用Router::connect,但也无法实现。我很乐意接受任何一种解决方案

目标是:将我笨拙的旧查询字符串(?action=show&id=3)路由或重定向到groovy CakePHP URL(/show/3),例如,一旦我完成切换到Cake,人们现有的书签仍然可以使用。我真正需要捕获的是id=bit中的数字

以下是我最近一次尝试重写规则(.htaccess in webroot):

他什么也不做

以下是我在路由器::连接方面的最新尝试:

Router::connect(
'index.php?action=show&id=:id',
array('controller' => 'features', 'action' => 'view'),
array('pass'=>array('id'),'id' => '[0-9]+')
);

什么都不做。我现在已经花了整整三个漫长的晚上阅读、尝试和失败。我已经准备好接受您的帮助。

我无法帮助您使用路由器,因为我从来没有在CakePHP中使用过不漂亮的URL,但是我可以告诉您如何使用
mod_rewrite

重写尝试的问题是
RewriteRule
仅匹配URI的路径部分,如果您愿意,则必须将
RewriteCond
%{QUERY\u STRING}
变量一起使用,如下所示:

RewriteCond %{QUERY_STRING} id=(\d+)$
RewriteRule ^.*$ /Features/view/%1? [R=301,L]
不要忘记重写规则替换部分末尾的
,这确保了原始查询字符串不会被追加,在这种情况下,由于查询和路径匹配规则非常松散,这将导致无限循环。您可能希望进一步修改规则,例如:

RewriteCond %{QUERY_STRING} ^action=show&id=(\d+)$
RewriteRule ^index\.php$ /Features/view/%1? [R=301,L]

但是,这当然取决于您的特定URI,因此请将其视为基本起点。

您不能基于get参数定义路由,因为它们不是用于匹配定义模式的字符串的一部分(因为它们是正则表达式,“index.php?a…”也不意味着该文本字符串)。您的重写规则与get参数不匹配-它与url匹配,例如“/id=123”-这就是它不做任何操作的原因。非常感谢,这非常有用。你让我开心。最后,我不得不在“行动”之前去掉问号,它就像一个符咒。不管出于什么原因,在我明白这些原则之前,你已经解释过了。我相信我读过的所有教程中都有这样的内容,但是……无论如何,谢谢你,你以个人英雄的身份进入书中。对不起,我的错,
RewriteCond
部分中的问号是一个复制粘贴错误(我已经更新了答案)。
RewriteCond %{QUERY_STRING} ^action=show&id=(\d+)$
RewriteRule ^index\.php$ /Features/view/%1? [R=301,L]