Запрос PUT возвращает 406 (неприемлемо) из Backbone.js на мою страницу PHP с полным REST - PullRequest
2 голосов
/ 15 января 2012

Я написал REST-ful API с использованием Fat Free Framework на PHP и выполняю вызов с использованием backbone.js.Когда я пытаюсь сохранить новую модель Orders, мое приложение отправляет запрос PUT, и сервер выдает ошибку 406.

Request Method:PUT
Status Code:406 Not Acceptable

Request Headers
Accept:application/json, text/javascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:174
Content-Type:application/json
Cookie:__utma=239804689.76636928.1286699220.1305666110.1325104376.94; __utmz=239804689.1325104376.94.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=935d2632fd0d12a1a0df4cb0f392eb5e
X-Requested-With:XMLHttpRequest

Request Payload
{"id":0,"customerId":0,"lastPage":"items","priceConfig":null,"items":null,"saveStatus":0,"savedAt":1326588395899,"name":null}

Response Headers
Connection:Keep-Alive
Content-Length:460
Content-Type:text/html; charset=iso-8859-1
Date:Sun, 15 Jan 2012 00:46:37 GMT
Keep-Alive:timeout=5, max=98
Server:Apache

Мой файл .htaccess выглядит следующим образом:

# Enable rewrite engine and route requests to framework
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]

# Disable ETags
<IfModule mod_headers.c>
    Header Unset ETag
    FileETag none
</IfModule>

# Default expires header if none specified (stay in browser cache for 7 days)
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault A604800
</IfModule>

<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

Приложение моего веб-сайта отлично работает на моем локальном сервере и делает это только на моем веб-сервере.Есть идеи, что не так?

1 Ответ

1 голос
/ 16 января 2012

Я нашел обходной путь.

Полагаю, мой сервер использует mod_security2 для блокировки запросов PUT и DELETE.Я жду ответа от них, и mod_security2 не может быть отключен в файлах .htaccess, поэтому я ничего не могу сделать.

Использование «Script PUT / filename» в файле .htaccess вызывало ошибку 500: «Сценарий здесь не разрешен», я не уверен, почему, но я решил не иметь дела с перенастройкой моего веб-хоста наобрабатывать PUT и DELETE.

Чтобы сохранить мой API REST-full, я оставил обычную обработку PUT и DELETE и добавил это к обработке POST:

function post() {
    //if Backbone.emulateHTTP is true, emulate PUT
    $data = json_decode(F3::get('REQBODY'), true);
    $type = $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; //PUT, DELETE, POST
    if ($type == 'PUT') {
        $this->put();
        return;
    }
    if ($type == 'DELETE') {
        $this->delete();
        return;
    }

    //handle normal POST here
}

Если вы установилиBackbone.emulateHTTP = true;он сохраняет метод запроса как POST и отправляет X-HTTP-Method-Override как PUT или DELETE.

Мне нравится это, потому что я могу сохранить свою реализацию REST-ful без изменений и просто закомментировать код emulateHTTP длякогда я публикую на своем веб-сервере.

...