CakePHP URL重写与CakeRequest :: onlyAllow冲突

时间:2014-06-04 16:47:25

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

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

问题是我在.htaccess文件中使用网址重写,并且正在将请求从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方法更改为{{ 1}}

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

我尝试在posts/delete/33579/函数中添加斜杠但是Cake会对斜杠进行编码并将其更改为$this->Form->postLink()

我正在使用CakePHPH 2.3.1

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

1 个答案:

答案 0 :(得分:2)

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

  • 修复生成的网址。这是最明智的一个,你可以想象
  • 如果请求是POST请求(或只是让它与get请求匹配),则阻止规则匹配。您可以使用%{THE_REQUEST}

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