我用Nginx(端口:8080)反向代理了全栈Rails应用程序(端口:3000)。没有Nginx,localhost:3000可以工作(我可以get, post, patch, delete
s)。在localhost:8080上,我只能get
,但不能post, delete, patch
。例如,一个经过修饰的'update'方法使用以下代码段:
import { csrfToken } from "@rails/ujs";
const postGenreToResto = async (obj = {}) => {
try {
const response = await fetch("/updateGenre", {
method: "PATCH",
headers: {
Accept: "application/json",
"X-CSRF-Token": csrfToken(),
"Content-Type": "application/json",
},
credentials: "same-origin",
body: JSON.stringify(obj),
});
return await response.json();
} catch (err) {
console.log(err);
}
};
export { postGenreToResto };
我的错误是:
Started PATCH "/updateGenre" for 127.0.0.1 at 2020-10-07 17:04:04 +0200
Processing by RestosController#updateGenre as JSON
Parameters: {Parameters: {"authenticity_token"=>"s+bpdFxhy2Sr...","genre_id"=>"7", "id"=>"1", "resto"=>{"id"=>"1", "genre_id"=>"7"}}
HTTP Origin header (http://localhost:8080) didn't match request.base_url (http://localhost)
Completed 500 in 2ms (ActiveRecord: 0.0ms | Allocations: 1787)
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
csrf-token
没问题。可能是Nginx设置问题,尤其是标题吗?
----编辑---
使用下面的修改后的/etc/nginx/nginx.conf
文件,它可以工作。在本地主机上,当服务Nginx运行并正在侦听端口:8080时,我可以像在Rails服务的本地主机:3000上那样发布/修补/删除。我使用buildpack在Heroku上推送了此配置,并且效果很好。
Nginx文档不太容易阅读,我不确定我是否真的理解我的所作所为:)
upstream app_server {
server 127.0.0.1:3000 fail_timeout=0; # version tcp/ip <=> port
}
server {
listen 8080;
location / {
try_files $uri @rails;
}
location @rails {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
##proxy_set_header X-Forwarded-Port $server_port;
## proxy_set_header X-Forwarded-Host $host;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}