У меня проблема, когда клиенты, вызывающие API, получают 401. Я не знаю почему. Вот как выглядит конфигурация:
1 server {
2 listen 44.111.222.333:443 ssl;
3
4 root /var/www/widgetapp/public;
5 server_name widgetapp;
6
7 ssl_certificate /etc/ssl/s/bundle.crt;
8 ssl_certificate_key /etc/ssl/s/s.key;
9 ssl_protocols TLSv1.2;
10
11 error_log /var/log/nginx/widget_error.log warn;
12
13 index login.php;
14
15 location /?(.*) {
16 allow all;
17 try_files $uri $uri/$is_args /=404;
18 }
19
20 location ~ \.php$ {
21 fastcgi_split_path_info ^(.+\.php)(/.+)$;
22 fastcgi_pass unix:/var/run/php5-fpm.sock;
23 include fastcgi_params;
24 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
25 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
26 }
27
28 location /wdiget_api.php/ {
29 rewrite ^(.*)$ /_widgetapi$1 last;
30 }
31
32 location /_widgetapi{
33 #return 204 'location 3';
34 rewrite ^/_widgetapi/(.*)$ /$1 break;
35 fastcgi_split_path_info ^(.+?\.php)(/.*)$;
36 include fastcgi_params;
37 fastcgi_pass unix:/var/run/php5-fpm.sock;
38 fastcgi_index widgetapi.php;
39 }
40
41 }
42
клиенты "вызывают" этот API, выполняя что-то вроде этого:
POST https://widgetapp/widget_api.php/auth/12345/test1/test1;
Это немедленно возвращает 401. Когда я добавляю «return 204», тогда все начинает работать. В качестве альтернативы ... если я изменю код клиента, чтобы сделать GET вместо POST ... и я удаляю возврат 204, также работает. Но я не могу объяснить почему.
Я знаю, когда вы делаете POST, технически вы должны отправлять данные не по URL, а по телу. В этом случае URL содержит нужные нам данные. Кроме того, я знаю, что вы не должны отправлять данные обратно, но в этом случае оригинальный программист отправляет данные обратно, если процедура POST прошла успешно.
Мне бы хотелось помочь понять, что генерирует 401 ... и почему 204 имеет значение.
Спасибо.