【问题标题】:rewriteRule in .htaccess using CakePHP使用 CakePHP 在 .htaccess 中重写规则
【发布时间】:2013-06-22 21:49:43
【问题描述】:

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

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

目标:将我笨拙的旧查询字符串 (?action=show&id=3) 路由或重定向到常规的 CakePHP URL (/show/3),例如,一旦我完成切换,人们现有的书签仍然有效给蛋糕。我真正需要捕获的只是 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]+')
);

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

【问题讨论】:

  • 您不能根据 get 参数定义路由,因为它们不是用于匹配已定义模式的字符串的一部分(因为它们是正则表达式,“index.php?a...”也不意味着那个文字字符串)。您的重写规则与获取参数不匹配 - 它与例如 url 匹配"/id=123" - 这就是它什么都不做的原因。

标签: cakephp mod-rewrite routes


【解决方案1】:

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

您的重写尝试的问题在于RewriteRule 仅匹配URI 的路径部分,如果您想要match the query string,那么您必须将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,因此请将此视为基本起点。

【讨论】:

  • 非常感谢,这非常有帮助。你让我今天一整天都感觉很好。最终我不得不在“行动”之前删除问号,它就像一个魅力。无论出于何种原因,在我点击这些原则之前,都需要您的解释。我确定在我阅读的所有教程中都有,但是...无论如何,谢谢,您以个人英雄的身份进入书籍。
  • 对不起,我的错,RewriteCond 部分中的问号是复制和粘贴错误(我已经更新了我的答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多