【问题标题】:CakePHP URL rewriting conflicts with CakeRequest::onlyAllowCakePHP URL 重写与 CakeRequest::onlyAllow 冲突
【发布时间】:2014-06-05 02:16:45
【问题描述】:

我使用$this->request->onlyAllow('post', 'delete'); 只允许删除来自POST 请求的记录。

问题是我在我的 .htaccess 文件中使用 URL 重写,它正在将请求从 POST 更改为 GET

这是我的.htaccess 文件的样子:

<IfModule mod_rewrite.c>
    Options -Indexes
    RewriteEngine On
    RewriteBase /example

    RewriteRule ^homes/$    http://dev.example.com/          [R=301,L]    

    # if this is an existing folder/file then leave
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule . - [L]

    # if no trailing slash then redirect to url with trailing slash
    RewriteRule ^/?(.+)([^/])$ $1$2/ [NE,R=301,L]

    # internal rewrite to controller/dispatcher index.php
    RewriteRule ^.*$ index.php [L,QSA]
</IfModule>

我正在使用postLink FormHelper 来生成删除按钮:

<?php 
    echo $this->Form->postLink(__('Delete'), 
    array('
        controller'=>'posts', 
        'action' => 'delete',), 
    null, 
    __('Are you sure you want to delete "%s?"', $attachment['Post']['name'])); 
?>

问题在于,从帮助程序生成的表单的操作还没有尾部斜杠,因此 htaccess 规则介入并广告它本质上将它从 POST 方法更改为 GET

生成的操作网址:posts/delete/33579 需要的操作网址:posts/delete/33579/

我尝试在 $this-&gt;Form-&gt;postLink() 函数中添加斜杠,但是 Cake 对斜杠进行编码并将其更改为 %2F

我正在使用 CakePHPH 2.3.1

关于如何解决此问题的任何建议?

【问题讨论】:

  • onlyAllow()(或 2.5+ 的 allowMethod())应该是你行动的第一件事:)
  • 你能举个例子说明你对@mark 的建议吗?
  • 例如见here。它应该是您的操作方法中的第一行。否则会不必要地触发 SQL 查询。
  • 您始终可以扩展帮助程序并覆盖生成 URL 的方法,以便附加斜杠。但是无论如何,这有什么意义,为什么 URL 是否有尾部斜杠很重要?
  • 答案是:不要。不要使用尾部斜杠,使用 Cake 标准(没有尾部斜杠) - 或查看 github.com/dereuromark/cakephp-trailing-slash

标签: php .htaccess cakephp mod-rewrite cakephp-2.3


【解决方案1】:

这是重定向的标准行为。你有两个选择:

  • 修复生成的 url。这是最明智的,您可能可以想象到
  • 如果请求是 POST 请求,则阻止规则匹配(或仅让它与 get 请求匹配)。你可以用%{THE_REQUEST}来做到这一点

    RewriteCond %{THE_REQUEST} ^GET\ /
    RewriteRule ^(.+)([^/])$ $1$2/ [NE,R=301,L]
    

【讨论】:

  • 您的代码似乎可以工作,但使用它时我有点紧张。这会产生任何不利影响或构成任何安全风险吗?另外,您对修复生成的 url 有什么建议吗?
  • 我不知道 CakePHP 是如何工作的,所以我不能就此给你建议。没有安全隐患,因为您不应该对与安全相关的事情使用重写。然而,我已经稍微改变了我的答案,因为实际的重写可以更简单地完成,如现在的答案所示。
  • 实际上你的第一个代码工作得更好。您当前的代码似乎添加了一个额外的斜杠,这会破坏应用程序。
  • 你是对的;我现在显然还没有真正清醒。
猜你喜欢
  • 2011-10-08
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多