nginx跨域的原理
首先要说到什么是跨域。
浏览器出于安全考虑,具有同源策略。白话来说就是为了确保网站本身的数据不会被随意篡改、偷窃,要验证你的身份。同源的要求是:协议(http,https),域名,端口
3个都要相同。一个不匹配都不能被认为是同源。
浏览器执行javascript脚本时,会检查这个脚本属于那个页面,如果不是同源页面,就不会被执行。
nginx作为一个典型的反向代理,可以优化负载,而且配置跨域很简单,只要修改nginx的conf文件就可以解决跨域问题。不需要修改任何代码,并且不会影响服务器性能。
工作时,相当于nginx把http请求转发到另一个或者一些服务器上。
对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。
简单说,nginx服务器欺骗了浏览器,让它认为这是同源调用,从而解决了浏览器的跨域问题。又通过重写url,欺骗了真实的服务器,让它以为这个http请求是直接来自与用户浏览器的。
自己遇到的一个问题,很久没有碰nginx了,今天启动发现失败。
先说环境,win10系统。
查看logs里的error文件,最下面报错是
9536#8296: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
有两种可能一是防火墙,二是端口被占用。
关闭防火墙后仍然启动失败,那么转向情况二。
nginx是监听80端口的,查看了下80被谁占用。
命令行输入netstat -nao
根据端口找到PID,对应为4.
去任务管理器里找到对应的PID,发现是system。
- 开始菜单 运行 输入 regedit
- 找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP
- 在右边找到Start这一项,将其改为0
- 重启系统,System进程不会占用80端口
还有一种方法:在nginx的配置文件里
把listen端口该掉。例如我改成了8881.
成功运行。
server {
listen 8881;
server_name localhost;
}
还有一个比较蠢的报错:
2017/08/28 18:48:45 [emerg] 8628#4160: host not found in upstream "xxx请求地址" in E:\nginx-1.12.0/conf/nginx.conf:129
查一下项目的根目录是否正确 =。= 或者你用来跨域请求的那个ip地址是否有变动。
有时候项目改了地址,nginx配置里的地址没有更改。
网友评论