调用 REST api 时出现 404 错误 (Phalcon)
404 error when calling REST api (Phalcon)
我在尝试使用 ajax 在 Phalcon 中调用 DELETE 或 PUT 时收到 404 错误。我可以执行 GET。
我的ajax:
$.ajax({
url: 'http://localhost/person/blah/5',
type: 'DELETE',
success: function (data) {
console.log(data);
}
});
我的PHP
$app->delete('/person/blah/{id:[0-9]+}', function($id) {
$response = new Phalcon\Http\Response();
$response->setJsonContent(array('status' => 'OK', 'data' => array('id' => $id)));
return $response;
});
在此之前,我遇到了有关 DELETE、PUT 和 GET 的 CORS 问题。我更改了我的 .htaccess 文件以允许访问控制并且 GET 开始工作。但是,我现在遇到 DELETE 和 PUT 的 404 问题。
这是我的 .htaccess 文件
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/ [QSA,L]
</IfModule>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "DELETE, PUT, GET"
Header set Access-Control-Allow-Headers: "X-Requested-With, Content-Type"
</IfModule>
我的猜测是这个问题与 CORS 有关。 javascript 在我的电脑(不是服务器)上是 运行。我的 javascript 在 C:/Users/username/Desktop/test.html。我在 Firefox 和 Chrome 中都试过了,但遇到了同样的问题。
一些额外的信息
回应header
Access-Control-Allow-Head... X-Requested-With, Content-Type
Access-Control-Allow-Meth... DELETE, PUT, GET
Connection Keep-Alive
Content-Length 15
Content-Type text/html
Date Tue, 10 Feb 2015 00:25:17 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9
Status 404 Not Found
X-Powered-By PHP/5.5.9
access-control-allow-orig... *
请求header
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Access-Control-Request-Me... DELETE
Connection keep-alive
DNT 1
Host localhost
Origin null
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
来自缓存的响应 header 与响应 header
相同
如果重要的话,我已经能够使用 curl 成功调用我的 DELETE。
$ curl -i -X DELETE http://localhost/person/blah/5
HTTP/1.1 200 OK
Date: Mon, 09 Feb 2015 23:18:40 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9
X-Powered-By: PHP/5.5.9
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: DELETE, PUT, GET
Content-Length: 33
Content-Type: text/html
{"status":"OK","data":{"id":"5"}}
可能想要按照流程图查看您错过了什么:
http://www.html5rocks.com/static/images/cors_server_flowchart.png
如果您正在利用 cookie 或需要响应 headers 暴露您将需要打开
Access-Control-Expose-Headers
和
Access-Control-Allow-Credentials
可能想尝试使用它们,即使您不是。
我的 .htaccess 文件中没有我需要的一切。
我需要这个:
# Always set these headers.
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ [R=200,L]
我在尝试使用 ajax 在 Phalcon 中调用 DELETE 或 PUT 时收到 404 错误。我可以执行 GET。
我的ajax:
$.ajax({
url: 'http://localhost/person/blah/5',
type: 'DELETE',
success: function (data) {
console.log(data);
}
});
我的PHP
$app->delete('/person/blah/{id:[0-9]+}', function($id) {
$response = new Phalcon\Http\Response();
$response->setJsonContent(array('status' => 'OK', 'data' => array('id' => $id)));
return $response;
});
在此之前,我遇到了有关 DELETE、PUT 和 GET 的 CORS 问题。我更改了我的 .htaccess 文件以允许访问控制并且 GET 开始工作。但是,我现在遇到 DELETE 和 PUT 的 404 问题。
这是我的 .htaccess 文件
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/ [QSA,L]
</IfModule>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "DELETE, PUT, GET"
Header set Access-Control-Allow-Headers: "X-Requested-With, Content-Type"
</IfModule>
我的猜测是这个问题与 CORS 有关。 javascript 在我的电脑(不是服务器)上是 运行。我的 javascript 在 C:/Users/username/Desktop/test.html。我在 Firefox 和 Chrome 中都试过了,但遇到了同样的问题。
一些额外的信息
回应header
Access-Control-Allow-Head... X-Requested-With, Content-Type
Access-Control-Allow-Meth... DELETE, PUT, GET
Connection Keep-Alive
Content-Length 15
Content-Type text/html
Date Tue, 10 Feb 2015 00:25:17 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9
Status 404 Not Found
X-Powered-By PHP/5.5.9
access-control-allow-orig... *
请求header
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Access-Control-Request-Me... DELETE
Connection keep-alive
DNT 1
Host localhost
Origin null
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
来自缓存的响应 header 与响应 header
相同如果重要的话,我已经能够使用 curl 成功调用我的 DELETE。
$ curl -i -X DELETE http://localhost/person/blah/5
HTTP/1.1 200 OK
Date: Mon, 09 Feb 2015 23:18:40 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9
X-Powered-By: PHP/5.5.9
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: DELETE, PUT, GET
Content-Length: 33
Content-Type: text/html
{"status":"OK","data":{"id":"5"}}
可能想要按照流程图查看您错过了什么: http://www.html5rocks.com/static/images/cors_server_flowchart.png
如果您正在利用 cookie 或需要响应 headers 暴露您将需要打开
Access-Control-Expose-Headers
和
Access-Control-Allow-Credentials
可能想尝试使用它们,即使您不是。
我的 .htaccess 文件中没有我需要的一切。
我需要这个:
# Always set these headers.
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ [R=200,L]