文章851
标签121
分类10

Nginx 配置跨域-http请求方法OPTIONS

介绍下场景 前端ajax 请求接口 前 进行了 options 请求
后端php 认为 options 是post 请求 所有导致 重复请求问题.

解决方案 判断 options 请求就 返回206

两种方式解决

php

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH');
exit();
}

nginx

location / { 

    if ( $request_method = 'OPTIONS' ) { 
        add_header 'Access-Control-Allow-Origin' "$http_origin";
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since,Content-Type';
        add_header 'Content-Length' 0;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        return 206;
    }   

    ....

使用nginx 比较靠谱

http OPTIONS解释

  1. 获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。支持请求方法与http协议版本及web服务器配置有关
  2. 用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。
  3. http返回正常状态码为206

MySQL 查看自增 ID 和表 DDL 等信息

在 MySQL 数据库管理中,查看表的自增 ID 设置以及表的 DDL(Data Definition Language,数据定义语言)信息是非常常见且有用的操作。本文将介绍如何在 MySQL 中查看表的自增 ID 设置和表的 DDL 信息。

查看表的自增 ID 设置

查询自增 ID 的表信息

要查看表的自增 ID 设置,可以使用如下的 SQL 查询语句:

SHOW TABLE STATUS LIKE 'your_table_name';

在这个查询中,将 your_table_name 替换为您要查询的表名。在查询结果中,可以找到 Auto_increment 字段,它表示表的下一个自增 ID 值。

示例

假设我们有一个表名为 users,可以使用以下 SQL 查询语句来查看该表的自增 ID 设置:

SHOW TABLE STATUS LIKE 'users';

查看表的 DDL 信息

获取表的 DDL 信息

要查看表的 DDL 信息,可以使用如下的 SQL 查询语句:

SHOW CREATE TABLE your_table_name;

这将返回包含创建表的 DDL 语句的结果,包括表的结构、键、约束等详细信息。

示例

继续以 users 表为例,您可以使用以下 SQL 查询语句来获取该表的 DDL 信息:

SHOW CREATE TABLE users;

结论

通过以上介绍,您可以了解如何在 MySQL 中查看表的自增 ID 设置和表的 DDL 信息。这些操作对于数据库管理和维护非常重要,可以帮助您更好地了解表的结构和设置。

CORS 简单请求+预检请求(彻底理解跨域)

概述

当一个资源从与该资源本身所在的服务器不同的域、协议、端口请求一个资源时,资源会发起一个跨域 HTTP 请求。同源策略参考 浏览器的同源策略 | MDN

出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求,XMLHttpRequest和Fetch API,只能从加载应用程序的同一个域请求HTTP资源,除非使用CORS头文件

对于浏览器限制这个词,要着重解释一下:不一定是浏览器限制了发起跨站请求,也可能是跨站请求可以正常发起,但是返回结果被浏览器拦截了

CORS概述


跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。

另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。

服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

Xnip2024-02-29_09-54-57.png

简单请求


不会触发CORS预检的请求称为简单请求,满足以下所有条件的才会被视为简单请求,基本上我们日常开发只会关注前面两点

  1. 使用GET、POST、HEAD其中一种方法
  2. 只使用了如下的安全首部字段,不得人为设置其他首部字段

    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type 仅限以下三种

      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded
    • HTML头部header field字段:DPR、Download、Save-Data、Viewport-Width、WIdth
  3. 请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问
  4. 请求中没有使用 ReadableStream 对象

预检请求


需预检的请求要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响

下面的请求会触发预检请求,其实非简单请求之外的就会触发预检,就不用记那么多了

  1. 使用了PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH方法
  2. 人为设置了非规定内的其他首部字段,参考上面简单请求的安全字段集合,还要特别注意Content-Type的类型
  3. XMLHttpRequestUpload 对象注册了任何事件监听器
  4. 请求中使用了ReadableStream对象

以下是一个发起预检请求的例子
发起请求的origin与请求的服务器的host不同,而且根据上面的条件判断,触发了预检

Xnip2024-02-29_09-57-15.png

请求附带身份凭证 -> cookies


如果发起请求时设置withCredentials 标志设置为 true,从而向服务器发送cookie, 但是如果服务器端的响应中未携带Access-Control-Allow-Credentials: true,浏览器将不会把响应内容返回给请求的发送者

对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为*, 必须是某个具体的域名

注意,简单 GET 请求不会被预检;如果对此类带有身份凭证请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页

完整请求流程


Xnip2024-02-29_09-58-28.png

参考
HTTP访问控制(CORS) | MDN
Server-Side Access Control | MDN
Using CORS - HTML5 Rocks
浏览器的同源策略 | MDN

原文地址 : https://github.com/amandakelake/blog/issues/62

Crontab 指定执行用户

最近有个问题困扰我.
crontab 执行脚本生成文件都是root 用户.
web 写文件 apache 用户 造成apacheroot 同时写一份日志 apache 权限不足!!
解决方案 :


vim /etc/crontab 
*  *  *  *  * user-name command to be executed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

#OTC每分钟检测订单更新订单状态
*/1 * * * *  apache /usr/bin/php /home/index.php Crontab autoUpdateOrderStatusCrontab >> /tmp/autoUpdateOrderStatusCrontab.log 2>&1

php7.2 使用xhprof 问题

最近项目面临测试基本服务ok, 开始检查性能及流程问题. 使用xhprof可视化观察接口问题. 出现一些问题

1. 下载xhprof

这里下载吧 :https://github.com/longxinH/xhprof.git

2. 安装 xhprof 扩展

cd xhprof/extension/

/usr/local/php/bin/phpize 
./configure --with-php-config=/opt/php-7.0.14/bin/php-config --enable-xhprof
make&&make install

3. 修改 php.ini 文件

php -i | grep php.ini 

[xhprof]
extension=xhprof.so
xhprof.output_dir=/data/www/xhprof/save_output_dir //该目录自由定义即可,用来保存xhprof生成的源文件

4.安装dot (绘图工具)

sudo yum install -y graphviz 
  • 如果遇到错误 failed to execute cmd: " dot -Tpng". stderr: (process:24220): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() 。暂时不清楚怎么解决,可以选择避开它。将 xhprof_lib/utils/callgraph_utils.php 的 121,122 行的打印和 exit 注释掉。
  • 如果遇到错误 Error: either we can not find profile data for run_id xxx or the threshold 0.01 is too small or you do not have 'dot' image generation utility installed,无法生成 png 图片,可能是因为生成的文件中有不能识别的字符,修复如下:

      $cmd="dot-T".$type;
      //在cmd之后添加一个转码工作就可以了
      $dot_script=iconv("UTF-8","ASCII//IGNORE",$dot_script);

xhprof 性能参数说明:

性能点 描述 :

  • Inclusive Time 包括子函数所有执行时间
  • Exclusive Time/Self Time 函数执行本身花费的时间,不包括子树执行时间
  • Wall Time 花去了的时间或挂钟时间
  • CPU Time 用户耗的时间 + 内核耗的时间
  • Inclusive CPU 包括子函数一起所占用的 CPU
  • Exclusive CPU 函数自身所占用的 CPU
">