REQUEST_METHOD е променен на „POST_method=POST“

Когато правя публикация от формуляр, $_SERVER['REQUEST_METHOD'] е POST_method=POST, когато правя нормална заявка за получаване, стойността е GET. Това никога не е било така и се промени, след като актуализирах сървъра си.

Почти съм сигурен, че стойността трябва да е POST

Пример:

'REQUEST_METHOD' => 'POST_method=POST',

Използвам CakePHP и при изтривания, където е зададено $this->request->onlyAllow('post', 'delete');, получавам грешка Method not allowed, което разбирам, защото методът не е POST.

Някой знае ли къде е зададено това на сървъра или в php конфигурацията?

Актуализация 1:

Ако изпратя този формуляр:

<form action="/sources/select_categories/10" id="SourceCategorySelectCategoriesForm" method="post" accept-charset="utf-8">
<div style="display:none;"><input type="hidden" name="_method" value="POST"/></div>
<div class="submit"><input  class="btn btn-primary btn-lg" type="submit" value="Select Categories"/></div>
</form>

Взимам:

'REQUEST_METHOD' => 'POST_method=POST',

и публикуваните стойности са:

array(
'_method' => 'POST_method=POST'
)

И ако изпратя този формуляр:

<form action="/sources/select_categories/10" id="SourceCategorySelectCategoriesForm" method="post" accept-charset="utf-8">
<div style="display:none;"><input type="hidden" name="_method" value="POST"/></div>
    <input type="checkbox" name="data[SourceCategory][category_ids][]"  value="5" id="SourceCategoryCategoryIds"/>
    <input type="checkbox" name="data[SourceCategory][category_ids][]"  value="6" id="SourceCategoryCategoryIds"/>
    <input type="checkbox" name="data[SourceCategory][category_ids][]"  value="4" id="SourceCategoryCategoryIds"/>
    <input type="checkbox" name="data[SourceCategory][category_ids][]"  value="3" id="SourceCategoryCategoryIds"/>
<div class="submit"><input  class="btn btn-primary btn-lg" type="submit" value="Select Categories"/></div></form>

Взимам:

'REQUEST_METHOD' => 'POST',

Но получените стойности са:

array(
'_method' => 'POST',
'data' => array(
    'SourceCategory' => array(
        'category_ids' => array(
            (int) 0 => '5',
            (int) 1 => '6',
            (int) 2 => '4',
            (int) 3 => '3_method=POST',
            (int) 4 => '5',
            (int) 5 => '6',
            (int) 6 => '4',
            (int) 7 => '3'
        )
    )
)
)

Значи нещо странно се случва. Когато във формуляра няма никакви полета, методът на заявката се променя и ако имам полета, стойностите на полетата изглеждат смешно.

Някакви предложения на какво може да се дължи това?

АКТУАЛИЗАЦИЯ 2:

Току-що пробвах формуляр в собствения му php файл, заобикаляйки cakephp всички заедно

<form action="test2.php" method="post">
<input type="hidden" name="_method" value="POST"/>
<input type="submit" value="Select Categories"/>
</form>

$_SERVER["REQUEST_METHOD"] остава "POST", но print_r($_POST) изобразява:

Array
(
    [_method] => POST_method=POST
)

Така че изглежда, че трябва да е php или apache, който променя пост променливата "_method" и след това CakePHP променя $_SERVER["REQUEST_METHOD"].

Това ме прави безсмислен и не знам откъде да започна с това. Може би деинсталирате php и apache?

Актуализация 3

Формуляр 1

<form action="test2.php" method="post">
<input type="hidden" name="x" value="y"/>
<input type="submit" value="Submit"/>
</form>

Дава

Array
(
    [x] => yx=y
)

Формуляр 2:

<form action="test2.php" method="post">
<input type="hidden" name="x" value="y"/>
<input type="hidden" name="a" value="b"/>
<input type="submit" value="Submit"/>
</form>

Дава:

Array
(
    [x] => y
    [a] => b
)

Така че, ако се публикува една скрита стойност, независимо от името, тя се променя, ако се публикуват 2 стойности, изглежда, че работи добре.


person Jaco Roux    schedule 11.11.2013    source източник
comment
Каква версия на cakephp използвате?   -  person Leonardo    schedule 11.11.2013
comment
Използвам версия 2.3   -  person Jaco Roux    schedule 11.11.2013
comment
Но го прави на всички мои инсталации на CakePHP, 2.2 и 2.3. Трябва да е нещо в PHP или Apache, което се е променило и не съм сигурен какво   -  person Jaco Roux    schedule 11.11.2013
comment
_method е поле, използвано за симулиране на други HTTP глаголи с форма (пост). Проверете изходните си файлове за POST_method, този низ идва отнякъде и не е в немодифициран CakePHP. От описанието може да е javascript, който променя стойностите на вашия формуляр - особено от това: '3_method=POST',   -  person AD7six    schedule 12.11.2013
comment
Току-що създадох нов виртуален хост, без нищо друго освен формата, и стойността все още е променена. Също така се случва във всички браузъри, така че не е някакво разширение. Направи HTTPFOX на заявката и стойността, която се изпраща на сървъра, е чиста.   -  person Jaco Roux    schedule 12.11.2013


Отговори (2)


Изглежда го оправих, въпреки че все още нямам представа какво го е причинило.

Деинсталирах PHP

sudo apt-get -y purge php*

След това инсталира PHP

sudo apt-get install php5

Тогава всичките ми либи

sudo apt-get install php5-mysql
sudo apt-get install php5-gd
sudo apt-get install php5-xmlrpc
sudo apt-get install php5-curl

И след всичко това все още работи. Не съм сигурен дали съм забравил нещо, но изглежда всичко работи отново.

Все пак бих искал да знам каква php lib е причинила промяната на променливите.

Благодаря за целия принос от всички.

person Jaco Roux    schedule 12.11.2013

Стойността се задава в CakeRequest::_processPost().

Той извлича стойността или от променливата на средата HTTP_X_HTTP_METHOD_OVERRIDE (която произхожда от HTTP заглавката X-HTTP-Method-Override), или от полето _method POST. Последният се дефинира автоматично в скрито поле от класа FormHelper (вижте FormHelper::create(), FormHelper::postList()).

Ще трябва да направите известно отстраняване на грешки, да проверите дали изпращате споменатата заглавка, да прегледате HTML източника на вашия формуляр, полето _method трябва по подразбиране да съдържа само POST или PUT. Ако има нещо друго в полето, проверете дали може би не предавате опцията method на помощните методи (въпреки че в този случай стойността трябва да е само с главни букви).

person ndm    schedule 11.11.2013
comment
Моля, вижте моята актуализация на кода в оригиналния въпрос, наистина няма смисъл - person Jaco Roux; 12.11.2013