分类 我爱编程 下的文章

Django 表单提交出现 CSRF verification failed. Request aborted

Django表单跨域提交时出现CSRF verification failed. Request aborted,一共有三种解决办法:

 

一、解决方法根据错误提示里已经给出了。在表单里加上{% csrf_token %}就行了。

 

二、在Settings里的MIDDLEWARE_CLASSES增加配置:

'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware',
如果第一种或者第二种或者第一第二混合使用依然没法解决,那么久只能使用第三种强硬的手段了,非到必要时不推荐使用第三种方法
三、禁用CSRF 的方法,根据python版本自行找到csrf.py文件,一下以python2为例:
修改C:\Python27\Lib\site-packages\django\middleware\csrf.py
#找到如下代码: if request.method not in ('GET', 'HEAD', 'OPTIONS', 'TRACE'):
#修改为:             if request.method not in ('GET','POST', 'HEAD', 'OPTIONS', 'TRACE'):

error: command 'x86_64-linux-gnu-gcc' failed with exit status 4 or 1

安装编译时出现报错error: command 'x86_64-linux-gnu-gcc' failed with exit,常见退出状态为1,则是依赖不足,根据版本不同安装如下依赖:

sudo apt-getinstall libxml2
sudo apt
-getinstall libxslt1.1sudo apt-getinstall libxml2-dev
sudo apt
-getinstall libxslt1-dev
sudo apt
-getinstall python-libxml2
sudo apt
-getinstall python-libxslt1
sudo apt
-getinstall python-dev
sudo apt
-getinstall python-setuptools

easy_install lxml
当退出状态为4时,则是机器内存不足,导致没有足够的内存进行编译解决办法为释放内存或者增加swap 释放内存:echo 3 > /proc/sys/vm/drop_caches 增加SWAP:
dd if=/dev/zero of=/swap1 bs=1M count=1024
mkswap /swap1
chown root:root /swap1
chmod 0600 /swap1
swapon /swap1

增加SWAP后重新释放内存

nginx与ngrok共存(nginx反代ngrok)

记得之前刚搭建起来ngrok时当时很兴奋觉得很舒服,但是很快产生了一个问题,ngrok占用80和443的话,那nginx该怎么办呢,虽然想过ngrok监听别的端口,但是一些程序却必须使用80和443,然后当时就想到了反代,但是泛域名反代而且端口不同,如何正确处理主机头成了问题,反代一个域名可以将主机头写成固定的,但是泛域名则是不确定主机头的,网上查了许久资料均未找到答案,后来不报希望的试了下,竟然成功了,今日想起来这件事情,便写博文记录下来。

涉及到的配置文件

nginx的nginx.conf user nginx; #上面用户可根据情况换成root(不推荐) worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; }
ngrok反向代理文件(主要!) server { listen 80; server_name *.0n0.win; root html; index index.html index.htm index.php; location / { proxy_pass http://127.0.0.1:81; proxy_redirect off; proxy_set_header Host $host:81; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } } server { listen 443; server_name *.0n0.win; ssl on; ssl_certificate /root/ngrok/rootCA.pem; ssl_certificate_key /root/ngrok/rootCA.key; root html; index index.html index.htm index.php; location / { proxy_pass https://127.0.0.1:444; proxy_redirect off; proxy_set_header Host $host:444; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }

我的nginx包含的模块那两个模块可根据自己需要自行删除或添加 ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-ipv6 --with-http_spdy_module --add-module=/root/mk/ngx_http_substitutions_filter_module --add-module=/root/mk/headers-more-nginx-module
两个模块的git
两个都是反代时替换内容用到的
mkdir /root/mk &&cd /root/mk git clone https://github.com/openresty/headers-more-nginx-module.git git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git

 

 

原文:https://blog.ni-co.moe/archives/345

ubuntu搭建ngrok服务器,尽享内网穿透技术带来的福利

如果你做微信开发,一次又一次的发布、发现错误、调试、发布、发现错误、调试…的循环一定让你个人或是团队感到厌倦;
如果你接外包项目,在开发过程中,客户想要看一看开发中的进展,你一定为还没有可预览环境或者搭建环境产生的消耗而苦恼。

这一切的原因仅仅是因为你深处复杂的内网环境,被一个局域网阻断了与外部的直接联系。你一定希望有一样东西,能够冲破这层阻隔,为你的工作提高效率。
这篇文章我们介绍 ngrok,一个开源软件,可以用于提供内网穿透。

以下我记录下ngrok服务的搭建过程。

一、准备工作

  1. 需要一个有公网IP的VPS
  2. 需要一个能够自由解析的域名

二、解析域名

使用自己的域名,把域名解析到 VPS 的地址,解析方式如下:

1
2
ngrok.uprogrammer.cn ----------> A记录到你的 VPS IP
*.ngrok.uprogrammer.cn ----------> CNAME到ngrok.uprogrammer.cn

三、VPS 服务端安装 go 环境

因为 ngrok 是由 go 语言开发的,所以需要安装 go 环境。

1. 从 go 官网下载最新的 go 版本,并解压到 /usr/local 目录下。

1
2
wget -c https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
tar -C /usr/local -zxvf go1.7.4.linux-amd64.tar.gz

2. 设置相关环境变量

1
2
3
4
5
6
# 可以根据自己需要调整路径
echo 'export GOROOT=/usr/local/go' >> /etc/profile
echo 'export PATH=$PATH:$GOROOT/bin' >> /etc/profile
echo 'export GOPATH=$HOME/go' >> /etc/profile
echo 'export GOROOT_BOOTSTRAP=/usr/local/go' >> /etc/profile
source /etc/profile

3. 检查是否安装成功

1
go version

四、安装 Git 环境

由于我们通过 github 上的源码来安装 ngrok,所以需要先安装下 git。如果已经有 git环境,则直接跳过。

ubuntu 上可以直接通过 apt-get install git 来安装 git。完成以后,做相应的 git 配置,此处略过。

五、Ubuntu 安装 ngrok

1. 下载 ngrok,并修改参数

1
2
3
4
5
cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=/usr/local/ngrok/
export NGROK_DOMAIN="ngrok.uprogrammer.cn"
cd ngrok

2. 生成证书(必须)

1
2
3
4
5
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

3. 将源代码目录下生成的证书文件复制到指定的位置

1
2
3
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

4. 如果是在国内的服务器,需要执行下面的修改,否则会由于网络原因产生库的依赖问题。香港或者国外的服务器就不需要了。

1
2
vim /usr/local/ngrok/src/ngrok/log/logger.go
log "github.com/keepeye/log4go"

5. 编译服务器,这里也同时编译了一个 linux 下的客户端。64位系统使用 amd64,如果是32位,需要修改成 amd386。
编译的时候,这里可能会遇到一个坑,后面会讲到。

1
2
3
4
cd /usr/local/go/src
GOOS=linux GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=linux GOARCH=amd64 make release-server release-client

编译 Mac 64 位客户端

1
2
3
4
cd /usr/local/go/src
GOOS=darwin GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=darwin GOARCH=amd64 make release-client

编译 Windows 64位客户端

1
2
3
4
cd /usr/local/go/src
GOOS=windows GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=windows GOARCH=amd64 make release-client

六、服务端运行与使用

1. 进入服务端目录,服务端程序文件名为 ngrokd,并执行相应命令

1
2
cd /usr/local/ngrok/bin
./ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80"

2. 返回类似如下的结果,则说明服务端运行成功

1
2
3
4
5
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds

七、客户端的运行与使用

1. 把刚刚从 VPS 服务器上生成的客户端服务器下载到本机,可以通过 scp 命令

1
scp username@servername:/path/filename /var/www/local_dir(本地目录)

mac 客户端的位置:

1
/usr/local/ngrok/bin/darwin_amd64/ngrok

windows 客户端的位置:

1
/usr/local/ngrok/bin/windows_amd64/ngrok.exe

linux 客户端的位置:

1
/usr/local/ngrok/bin/ngrok

2. 客户端程序下载到本地以后,在本地同一目录下新建名为 ngrok.cfg 的文件,文件内容如下:

1
2
server_addr: "ngrok.uprogrammer.cn:4443"
trust_host_root_certs: false

3. 运行客户端

1
2
3
4
./ngrok -config=./ngrok.cfg -subdomain=test 8080
# -subdomain参数指的是域名,例如这里是test.ngrok.uprogrammer.cn
# 后面的80是指本机端口,这里是指把本机的8080端口开放穿透
# windows运行客户端,请把./改成win风格的目录方式

4. 返回类似如下的结果,则说明客户端运行成功

1
2
3
4
5
6
7
Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://test.ngrok.uprogrammer.cn -> 127.0.0.1:8080
Forwarding                    https://test.ngrok.uprogrammer.cn -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

接下来,你就可以运行本地 8080 端口的程序,看一看是不是通过 test.uprogrammer.cn 就可以访问啦,也可以发给局域网之外的人来访问^ ^

八、可能遇到的坑

1. 出现以下错误提示:$GOROOT_BOOTSTRAP must not be set to $GOROOT

1
2
3
4
##### Building Go bootstrap tool.
cmd/dist
ERROR: $GOROOT_BOOTSTRAP must not be set to $GOROOT
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.

配置的 $GOROOT_BOOTSTRAP$GOROOT 一致导致。可以复制一份 go 的源码到另外的路径,如 /usr/local/go-copy,同时 export GOROOT_BOOTSTRAP=/usr/local/go-copy

2. 客户端可以连上,但域名不完全,显示如下:

1
2
3
4
5
6
7
Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://test. -> 127.0.0.1:8080
Forwarding                    https://test. -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

这种错误是由于服务端运行时环境变量没有正确配置导致的,可以显示设置域名:

1
./ngrokd -domain="ngrok.uprogrammer.cn" -httpAddr=":80"

3. 如果你对 VPS 服务器已经有其他程序占用 80 端口,而还需要 ngrok 通过80端口做内网穿透的话,可以通过 nginx 来做反向代理。

 

注意事项

客户端ngrok.cfg中server_addr后的值必须严格与-domain以及证书中的NGROK_BASE_DOMAIN相同,否则Server端就会出现如下错误日志:

注意事项

客户端ngrok.cfg中server_addr后的值必须严格与-domain以及证书中的NGROK_BASE_DOMAIN相同,否则Server端就会出现如下错误日志:
1

2

3

4
[03/13/15 09:55:46] [INFO] [tun:15dd7522] New connection from 54.149.100.42:38252

[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Waiting to read message

[03/13/15 09:55:46] [WARN] [tun:15dd7522] Failed to read message: remote error: bad certificate

[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Closing

 

Let’s Encrypt Detail: Invalid response from

当验证域名时提示403 Forbidden,并且提示:

To fix these errors, please make sure that your domain name was
entered correctly and the DNS A record(s) for that domain
contain(s) the right IP address.

因为默认LNMP 1.3的虚拟主机里是禁止.开头的隐藏文件及目录的。需要将
location ~ /\.
{
deny all;
}
这段配置删掉或注释掉或在这段配置前面加上

location ~ /.well-known {
    allowall;
}

保存,重启nginx。