2017-04-26 67 views
0

我有一個正常的PHP腳本監聽$ _SERVER [「REQUEST_METHOD」] 我使用PUT方法進行表單提交,但在nginx服務器上收到錯誤405 。如何允許Nginx的PUT刪除表單提交

只是想使用請求方法提交一個簡單的表單。

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

'如果代碼== 0:打印( 「沒有幫助」)' –

+0

是否正確地工作吧? –

回答

1

nginx將只允許獲取靜態文件。爲了允許POST/PUT,必須將nginx配置爲通過PHP發送請求。所以,你在PUT上獲得405的事實似乎表明你正在請求一個靜態文件,這意味着你的nginx配置不會調用你認爲它的PHP。通過使用GET請求相同的URL,可以很容易地測試它 - 如果配置正確,您將獲得PHP輸出。如果配置不正確,您將獲得PHP源代碼。

+0

問題是我在打電話?羣組而不是index.php?羣組 –

0

這不是HTML規範的支持,使瀏覽器將改爲發送GET請求如果表單方法不是GET或POST。所以一旦請求到達你的服務器就已經太晚了。

此問題通常在框架中通過「方法欺騙」得到解決。設置你的形式是這樣的:

<form method="post" ...> 
    <input type="hidden" name="_method" value="put" /> 
    ... 
</form> 

然後在PHP中使用這些信息來評估如何路由請求。

也可以在Nginx圖層上完成此操作,但恐怕我不能就此提出建議。

0

正如其他答案指出的那樣,nginx不允許除GET或POST之外的其他方法來靜態資源。因此你需要確保請求直接進入你的php處理。

如果您直接撥打index.php或任何特定的php文件,我遇到的大部分配置都可以正常工作。當您希望/的呼叫由index.php處理時,您仍然希望支持靜態資源服務,則會出現此問題。

經過一段時間的工作,我發現你可以嵌套在nginx配置中的location指令。這使您可以控制文件擴展名正則表達式配置,而不會使事情太複雜。這是我正在使用的。請注意,您的phpcgi配置位於單獨的文件中。

location ~ .+(?<!\.php)$ { 
 
    location ~ ^[^.]*\.[^.]+$ { 
 

 
    } 
 
    location ~/{ 
 
    include snippets/fastcgi-php.conf; 
 
    } 
 
} 
 

 
location ~ \.php$ { 
 
    include snippets/fastcgi-php.conf; 
 
}