0

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

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

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

这是我对 rewriteRule 的最新尝试(webroot 中的 .htaccess):

RewriteRule id=([0-9]+)$ /Features/view/%1 [R=301,L]

什么都不做。

这是我在 Router::connect 中的最新尝试:

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

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

4

1 回答 1

1

我无法在路由器方面为您提供帮助,因为我从未在 CakePHP 中使用过不漂亮的 URL,但是我可以告诉您它应该如何使用mod_rewrite.

您的重写尝试的问题是RewriteRule仅匹配 URI 的路径部分,如果您想匹配查询字符串,那么您必须使用RewriteCond变量%{QUERY_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,因此请将此视为基本起点。

于 2013-06-25T23:45:29.923 回答