Linxu下Yii2的POST提交被拒经历

早期于对Yii2的使用,浅谈一下自己的经验,在以往的项目中我使用的框架是Yii1,由于Yii2的出现,所以极力的想使用一下它的新特性。

根据不同的WEB服务器,分别给出具体的配置信息,在这我的使用环境Linux系统是CentOS 7.3,Nginx1.12.0安装的PHP版本为PHP 7.0.12:

Apache服务器端站点配置

1、修改配置文件:/etc/httpd/conf/httpd.conf中修改两处,若配置虚拟域名另参照其它配置。

DocumentRoot "/data1/vhosts/webapp/app.xxx.com"
<Directory "/data1/vhosts/webapp/app. xxx.com">

2、重定向站点目录,当前目录为 /data1/vhosts/webapp/app. xxx.com,该目录下有文件.htaccess

隐藏文件.htaccess中配置内容:

# prevent directory listings

Options -Indexes

# follow symbolic links

Options FollowSymlinks

RewriteEngine on

RewriteCond %{REQUEST_URI} ^.*$

RewriteRule ^(.*)$ /api/web/$1

Nginx服务器端站点配置

修改配置文件:/web/soft/nginx/conf/conf.d/default.conf

server {

    listen       80;

    server_name  47.95.248.18;

    root   /web/www/app.mzhjs.com/api/web;

    location / {

        index  index.php index.html index.htm;

        try_files $uri $uri/ /index.php?$args;

    }

    location ~ /\.(ht|svn|git) {

        deny all;

    }

    location = /50x.html {

        root   html;
    }

    location ~* apple-touch-icon {

        access_log off;

        rewrite .* /fav-icon.png last;

    }

    location ~ \.php$ {

        try_files $uri = 404;

        fastcgi_pass   127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }

    error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;

    access_log  /web/log/nginx/default.access.log;

}

特别说明:

Apache站点目录下的.htaccess文件中的内容移植到Nginx下需要在default.conf中配置,内容即为:

try_files $uri $uri/ /index.php?$args;

遇到问题

按照上面的配置,Yii2框架的站点可以正常访问,做到这认为一切OK。但是在此时遇到了一个很棘手的问题:手机app端以POST方式请求API的Web接口返回500错误,而PC端浏览器POST请求没问题。在此为Yii2的新手排解一些问题:

1、 起初我认为是Nginx的服务器问题,Nginx官方组织也曾发布Bug信息,在1.9.及一些版本的时候对IOS、Android 一些内核POST拒绝,看到这个信息,我一直以为问题是出在Nginx,这让我顿时怀疑它的稳定行,但是我还是不相信。

2、 POST大小限制,然后我又通过查找资料,也有的说受到POST大小限制;这一点我在用PC端浏览器POST提交成功,已经可以证明;同时我查看了配置,限制大小为18M,所以排除了这个疑虑。

3、 找到答案:终于在看Yii2的POST验证才知道有个csrf,是防止csrf攻击的,框架默认是开启的,当我将设置‘enableCsrfValidation‘ => false,时,问题就迎刃而解了,app端可以POST提交了。

相关推荐