我有一个普通的PHP脚本监听$ _SERVER [“REQUEST_METHOD”] 我使用PUT方法提交表单,但是我收到错误405 在nginx服务器上。
只想使用请求方法提交一个简单的表单。
1 server {
2
3 listen 80; # port 80 default
4
5 root /home/user/workspace/l; # default directory where the files will be stored and served from
6
7 index index.php index.html index.htm; # index defined to be served under directory
8
9 server_name l; #name of the virtual host or domain
10
11 error_log /var/log/nginx/l.error.log;
12 access_log /var/log/nginx/l.access.log;
13
14
15 location / {
16 try_files $uri $uri/ /index.html;
17 }
18
19 # Serve PHP scripts to FastCGI server our php-fpm server listening on 127.0.0.1:9000
20
21 location ~ \.php$ {
22 fastcgi_pass 127.0.0.1:9000;
23 # With php5-fpm:
24 #fastcgi_pass unix:/var/run/php5-fpm.sock;
25 fastcgi_index index.php;
26 fastcgi_split_path_info ^(.+\.php)(/.*)$;
27 include fastcgi_params;
28 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
29 }
30 }
请求调用是/index.php?groups
最初的电话是:
function updateGroup(group_name, group_id) {
values = {};
values.name = group_name;
values.id = group_id;
$.ajax({
url: '?groups',
type: 'PUT',
data: values,
success: success,
dataType: 'json'
});
}
答案 0 :(得分:1)
nginx只允许GET用于静态文件。为了允许POST / PUT,必须配置nginx以将请求发送到PHP。因此,您在PUT上获得405的事实似乎表明您正在请求静态文件,这意味着您的nginx配置不会在您认为的情况下调用PHP。通过使用GET请求相同的URL,可以非常轻松地测试这一点 - 如果配置正确,您将获得PHP输出。如果配置不正确,您将获得PHP源代码。
答案 1 :(得分:0)
HTML规范不支持此功能,因此如果表单方法不是GET或POST,浏览器将发送GET请求。因此,一旦请求到达您的服务器,它已经太晚了。
此问题通常通过"方法欺骗"在框架中解决。像这样设置表单:
<form method="post" ...>
<input type="hidden" name="_method" value="put" />
...
</form>
然后在PHP中使用此信息来评估如何路由请求。
也许可以在Nginx层上实现这一点,但我担心我无法就此提出建议。
答案 2 :(得分:0)
正如其他答案所指出的那样,nginx不允许GET或POST以外的方法使用静态资源。因此,您需要确保请求直接进入您的php处理。
如果您直接拨打index.php
或任何特定的php
文件,我遇到的大多数配置都可以正常工作。如果您希望/
处理index.php
的来电,但仍希望支持静态资源投放,则会出现此问题。
经过一段时间的努力,我发现你能够在nginx配置中嵌套location
指令。这允许您控制文件扩展名正则表达式配置,而不会使事情变得太复杂。这就是我正在使用的。请注意,您的php
cgi
配置位于单独的文件中。
location ~ .+(?<!\.php)$ {
location ~ ^[^.]*\.[^.]+$ {
}
location ~ / {
include snippets/fastcgi-php.conf;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
}