Postgresql 网址转码 urldecode 函数

分类

SQL

CREATE OR REPLACE FUNCTION urldecode_arr(url TEXT)
  RETURNS TEXT AS
$BODY$
DECLARE ret TEXT;

BEGIN
  BEGIN

    WITH STR AS (
        SELECT
          -- array with all non encoded parts, prepend with '' when the string start is encoded
          CASE WHEN $1 ~ '^%[0-9a-fA-F][0-9a-fA-F]'
            THEN ARRAY ['']
          END
          || regexp_split_to_array($1, '(%[0-9a-fA-F][0-9a-fA-F])+', 'i')                plain,

          -- array with all encoded parts
          array(SELECT (regexp_matches($1, '((?:%[0-9a-fA-F][0-9a-fA-F])+)', 'gi')) [1]) encoded
    )
    SELECT
      string_agg(plain [i] || coalesce(convert_from(decode(replace(encoded [i], '%', ''), 'hex'), 'GB18030'), ''), '')
    FROM STR,
      (SELECT generate_series(1, array_upper(encoded, 1) + 2) i
       FROM STR) blah

    INTO ret;

    EXCEPTION WHEN OTHERS
    THEN
      RAISE NOTICE 'failed: %', url;
      RETURN $1;
  END;

  RETURN coalesce(ret, $1); -- when the string has no encoding;

END;

$BODY$
LANGUAGE plpgsql
IMMUTABLE
STRICT

postgresql 星座 函数

分类

SQL

星座切换日期根据不同年份会有不同 前后有一两天差异。实际上星座的切换时间就是24节气中气的切换时间。


CREATE FUNCTION xingzuo(date)
  RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
  date_month INT;
  date_date  INT;
  xingzuo    VARCHAR;
BEGIN
  date_month := extract(MONTH FROM $1);
  date_date := extract(DAY FROM $1);
  CASE date_month
    WHEN 3
    THEN
      IF date_date > 20
      THEN
        xingzuo := '白羊';
      ELSE
        xingzuo := '双鱼';
      END IF;
    WHEN 4
    THEN
      IF date_date > 21
      THEN
        xingzuo := '金牛';
      ELSE
        xingzuo := '白羊';
      END IF;
    WHEN 5
    THEN
      IF date_date > 20
      THEN
        xingzuo := '双子';
      ELSE
        xingzuo := '金牛';
      END IF;
    WHEN 6
    THEN
      IF date_date > 20
      THEN
        xingzuo := '巨蟹';
      ELSE
        xingzuo := '双子';
      END IF;
    WHEN 7
    THEN
      IF date_date > 22
      THEN
        xingzuo := '狮子';
      ELSE
        xingzuo := '巨蟹';
      END IF;
    WHEN 8
    THEN
      IF date_date > 22
      THEN
        xingzuo := '处女';
      ELSE
        xingzuo := '狮子';
      END IF;
    WHEN 9
    THEN
      IF date_date > 22
      THEN
        xingzuo := '天平';
      ELSE
        xingzuo := '处女';
      END IF;
    WHEN 10
    THEN
      IF date_date > 22
      THEN
        xingzuo := '天蝎';
      ELSE
        xingzuo := '天平';
      END IF;
    WHEN 11
    THEN
      IF date_date > 21
      THEN
        xingzuo := '射手';
      ELSE
        xingzuo := '天蝎';
      END IF;
    WHEN 12
    THEN
      IF date_date > 21
      THEN
        xingzuo := '摩羯';
      ELSE
        xingzuo := '射手';
      END IF;
    WHEN 1
    THEN
      IF date_date > 19
      THEN
        xingzuo := '水瓶';
      ELSE
        xingzuo := '摩羯';
      END IF;
    WHEN 2
    THEN
      IF date_date > 18
      THEN
        xingzuo := '双鱼';
      ELSE
        xingzuo := '水瓶';
      END IF;
  END CASE;
  RETURN xingzuo;
END;
$$;

Postgresql 身份证 15位转18位 校验 函数

分类

SQL

CREATE OR REPLACE FUNCTION sfz15to18check(VARCHAR)
  RETURNS TABLE(idcard VARCHAR, judge INTEGER)
LANGUAGE plpgsql
AS $$
DECLARE
  idcard        VARCHAR;
  is_idcard     INTEGER;
  v_i           INTEGER;
  idcard_length INTEGER;
  v_s           VARCHAR;
  v_sum         INTEGER;
  v_array1      INTEGER [];
  v_array2      VARCHAR [];
BEGIN
  idcard := trim($1);
  idcard_length := char_length(idcard);
  v_array1 := ARRAY [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  v_array2 := ARRAY ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

  IF idcard_length = 15
  THEN
    IF idcard ~ '^[123456789]\d{5}\d{2}(0\d|10|11|12)(0\d|1\d|2\d|30|31)\d{3}'
    THEN
      /*15位转18位 加 19 前缀*/
      idcard := overlay(idcard PLACING '19' FROM 7 FOR 0);
      /*15位转18位 加校验码*/
      v_i := 1;
      v_sum := 0;
      LOOP
        v_s := substr(idcard, v_i, 1);
        v_sum := v_sum + cast(v_s AS INTEGER) * v_array1 [v_i];
        v_i := v_i + 1;
        IF v_i > 17
        THEN
          EXIT;
        END IF;
      END LOOP;
      v_sum := mod(v_sum, 11) + 1;
      v_s := v_array2 [v_sum];
      idcard := concat(idcard, v_s);
      is_idcard := 1;
    ELSE
      is_idcard := -1;
    END IF;

  ELSEIF idcard_length = 18
    THEN
      idcard := upper(idcard);
      IF idcard ~ '^[123456789]\d{5}(19|20)\d{2}(0\d|10|11|12)(0\d|1\d|2\d|30|31)\d{3}[\dX]'
      THEN
        /*检测 最后一位加校验码是否正确*/
        v_i := 1;
        v_sum := 0;
        LOOP
          v_s := substr(idcard, v_i, 1);
          v_sum := v_sum + cast(v_s AS INTEGER) * v_array1 [v_i];
          v_i := v_i + 1;
          IF v_i > 17
          THEN
            EXIT;
          END IF;
        END LOOP;
        v_sum := mod(v_sum, 11) + 1;
        v_s := v_array2 [v_sum];
        IF v_s = substr(idcard, 18, 1)
        THEN
          is_idcard := 1;
        ELSE
          is_idcard := -1;
        END IF;
      ELSE
        is_idcard := -1;
      END IF;
  END IF;
  RETURN QUERY SELECT
                 idcard,
                 is_idcard;
END;
$$

只用于18位身份证检测


CREATE FUNCTION sfz_check(CHARACTER VARYING)
  RETURNS INTEGER
LANGUAGE plpgsql
AS $$
DECLARE
  idcard        VARCHAR;
  is_idcard     INTEGER;
  v_i           INTEGER;
  idcard_length INTEGER;
  v_s           VARCHAR;
  v_sum         INTEGER;
  v_array1      INTEGER [];
  v_array2      VARCHAR [];
BEGIN
  idcard := $1;
  idcard_length := char_length(idcard);
  v_array1 := ARRAY [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  v_array2 := ARRAY ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

  IF idcard_length = 18
  THEN
    IF idcard ~ '^[123456789]\d{5}(19|20)\d{2}(0\d|10|11|12)(0\d|1\d|2\d|30|31)\d{3}[\dX]'
    THEN
      v_i := 1;
      v_sum := 0;
      LOOP
        v_s := substr(idcard, v_i, 1);
        v_sum := v_sum + cast(v_s AS INTEGER) * v_array1 [v_i];
        v_i := v_i + 1;
        IF v_i > 17
        THEN
          EXIT;
        END IF;
      END LOOP;
      v_sum := mod(v_sum, 11) + 1;
      v_s := v_array2 [v_sum];
      IF v_s = substr(idcard, 18, 1)
      THEN
        is_idcard := 1;
      ELSE
        is_idcard := -1;
      END IF;
    ELSE
      is_idcard := -1;
    END IF;
  END IF;
  RETURN is_idcard;
END;
$$;

postgresql 正则表达式

分类

SQL

字符

描述

\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"'\n' 匹配一个换行符。序列 '\\' 匹配 "\" "\(" 则匹配 "("

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' '\r' 之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' '\r' 之前的位置。

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo" * 等价于{0,}

+

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"+ 等价于 {1,}

?

匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" "does" 中的"do" ? 等价于 {0,1}

{n}

n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o

{n,}

n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'

{n,m}

m  n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo"'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'

.

匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。

(pattern)

匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0$9 属性。要匹配圆括号字符,请使用 ''

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)

正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y

匹配 x  y。例如,'z|food' 能匹配 "z" "food"'(z|f)ood' 则匹配 "zood" "food"

[xyz]

字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'

[^xyz]

负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'

[a-z]

字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 'z' 范围内的任意小写字母字符。

[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 'z' 范围内的任意字符。

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'

\B

匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'

\cx

匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\d

匹配一个数字字符。等价于 [0-9]

\D

匹配一个非数字字符。等价于 [^0-9]

\f

匹配一个换页符。等价于 \x0c \cL

\n

匹配一个换行符。等价于 \x0a \cJ

\r

匹配一个回车符。等价于 \x0d \cM

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

\t

匹配一个制表符。等价于 \x09 \cI

\v

匹配一个垂直制表符。等价于 \x0b \cK

\w

匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'

\W

匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'

\xn

匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.

\num

匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

\n

标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm

标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 的后向引用。如果前面的条件都不满足,若  n  m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm

\nml

如果 n 为八进制数字 (0-3),且 m  l 均为八进制数字 (0-7),则匹配八进制转义值 nml

\un

匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)

 

postgresql 基础操作命令

分类

SQL

# 查看查询进程
SELECT * FROM pg_stat_activity;
SELECT query,datid,pid,datname,usename,application_name FROM pg_stat_activity ORDER BY query ASC;


# 查询性能
explain analyze

# 数据库操作
# 创建数据库
CREATE DATABASE exampledb OWNER dbuser;
# 创建新表
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
# 插入数据
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');
# 选择记录
SELECT * FROM user_tbl limit 10;
# 更新数据
UPDATE user_tbl set name = '李四' WHERE name = '张三';
# 删除记录
DELETE FROM user_tbl WHERE name = '李四' ;
# 添加栏位
ALTER TABLE user_tbl ADD COLUMN email VARCHAR(40);
# 更新结构
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
# 更名栏位
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
# 删除栏位
ALTER TABLE user_tbl DROP COLUMN email;
# 表格更名
ALTER TABLE user_tbl RENAME TO backup_tbl;
# 删除表格
DROP TABLE IF EXISTS backup_tbl;
# 删除数据库 如果显示有其他人登录
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname=db_name' AND pid<>pg_backend_pid();
DROP DATABASE IF EXISTS db_name;
#清空表
TRUNCATE TABLE backup_tbl;
# 删除外部服务
DROP SERVER IF EXISTS  new_fdw_svr0 CASCADE;
#删除 外部表
DROP FOREIGN TABLE IF EXISTS hash_table_0 CASCADE;

# 用户操作
# 创建新用户
CREATE USER dbuser WITH PASSWORD 'password';

# 磁盘清理
VACUUM;
VACUUM FULL;

ubuntu下postgresql 10 或新版本安装

分类

SQL

# 如果要安装不在ubuntu软件仓库中的postgresql,需要先添加apt源;
apt源在 https://www.postgresql.org/download/linux/ubuntu/ 可查询

Ubuntu Xenial (16.04)

sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update

# 查询各版本及模块
apt-cache search postgresql

# 安装
apt-get install postgresql-10

# 添加新用户和新数据库
# 创建数据库用户dbuser,并指定其为超级用户
sudo -u postgres createuser --superuser dbuser

# 登录数据库控制台,设置dbuser用户的密码,完成后退出控制台
sudo -u postgres psql
\password dbuser
\q

# 在shell命令行下,创建数据库exampledb,并指定所有者为dbuser
sudo -u postgres createdb -O dbuser exampledb

# 登录数据库
psql -U dbuser -d exampledb -h 127.0.0.1

# 如果有需求,可配置全IP段访问
目录 /etc/postgresql/main/
postgresql.conf
#listen_addresses = ‘localhost’
listen_addresses = ‘*’

# pg_hba.conf
host all all 0.0.0.0/0 md5

linux系统下 bonding 负载均衡 bond_mode参数说明

分类

linux系统下bond mode参数说明:(mode=4 在交换机支持LACP时推荐使用,其能提供更好的性能和稳定性)
          0-轮询模式,所绑定的网卡会针对访问以轮询算法进行平分。
          1-高可用模式,运行时只使用一个网卡,其余网卡作为备份,在负载不超过单块网卡带宽或压力时建议使用。
          2-基于HASH算法的负载均衡模式,网卡的分流按照xmit_hash_policy的TCP协议层设置来进行HASH计算分流,使各种不同处理来源的访问都尽量在同一个网卡上进行处理。
          3-广播模式,所有被绑定的网卡都将得到相同的数据,一般用于十分特殊的网络需求,如需要对两个互相没有连接的交换机发送相同的数据。
          4-802.3ab负载均衡模式,要求交换机也支持802.3ab模式,理论上服务器及交换机都支持此模式时,网卡带宽最高可以翻倍(如从1Gbps翻到2Gbps)
          5-适配器输出负载均衡模式,输出的数据会通过所有被绑定的网卡输出,接收数据时则只选定其中一块网卡。如果正在用于接收数据的网卡发生故障,则由其他网卡接管,要求所用的网卡及网卡驱动可通过ethtool命令得到speed信息。
          6-适配器输入/输出负载均衡模式,在”模式5″的基础上,在接收数据的同时实现负载均衡,除要求ethtool命令可得到speed信息外,还要求支持对网卡MAC地址的动态修改功能。

 

Descriptions of bonding modes
    Mode 0
        balance-rr
Round-robin policy: Transmit packets in sequential order from the first available slave through the last. This mode provides load balancing and fault tolerance.
    Mode 1
        active-backup
Active-backup policy: Only one slave in the bond is active. A different slave becomes active if, and only if, the active slave fails. The bond's MAC address is externally visible on only one port (network adapter) to avoid confusing the switch. This mode provides fault tolerance. The primary option affects the behavior of this mode.
    Mode 2
        balance-xor
XOR policy: Transmit based on selectable hashing algorithm. The default policy is a simple source+destination MAC address algorithm. Alternate transmit policies may be selected via the xmit_hash_policy option, described below. This mode provides load balancing and fault tolerance.
    Mode 3
        broadcast
Broadcast policy: transmits everything on all slave interfaces. This mode provides fault tolerance.
    Mode 4
        802.3ad
IEEE 802.3ad Dynamic link aggregation. Creates aggregation groups that share the same speed and duplex settings. Utilizes all slaves in the active aggregator according to the 802.3ad specification.
    • Prerequisites:
        1. Ethtool support in the base drivers for retrieving the speed and duplex of each slave.
        2. A switch that supports IEEE 802.3ad Dynamic link aggregation. Most switches will require some type of configuration to enable 802.3ad mode.
    Mode 5
        balance-tlb
Adaptive transmit load balancing: channel bonding that does not require any special switch support. The outgoing traffic is distributed according to the current load (computed relative to the speed) on each slave. Incoming traffic is received by the current slave. If the receiving slave fails, another slave takes over the MAC address of the failed receiving slave.
    • Prerequisites:
        ○ Ethtool support in the base drivers for retrieving the speed of each slave.
    Mode 6
        balance-alb
Adaptive load balancing: includes balance-tlb plus receive load balancing (rlb) for IPV4 traffic, and does not require any special switch support. The receive load balancing is achieved by ARP negotiation. The bonding driver intercepts the ARP Replies sent by the local system on their way out and overwrites the source hardware address with the unique hardware address of one of the slaves in the bond such that different peers use different hardware addresses for the server.

来源:https://help.ubuntu.com/community/UbuntuBonding

ubuntu lxd 多网卡 负载均衡 bonding 加 bridge 配置

分类

多网卡 负载均衡 bonding


# 确保安装 ifenslave
sudo apt install ifenslave

# /etc/network/interfaces

auto lo
iface lo inet loopback

auto bond0
iface bond0 inet static
	address 192.168.0.22
	netmask 255.255.255.0
	gateway 192.168.0.1
	dns-nameservers 192.168.0.1
	bond-mode 0 # bond-mode有多个参数 不同的参数对应不同的负载均衡方案
	bond-lacp-rate fast
	bond-miimon 100
	post-up ifup eth0 eth1

iface eth0 inet manual
	bond-master bond0

iface eth1 inet manual
	bond-master bond0

bridge配置 kvm虚拟机也是这么配置


# 确保安装 bridge-utils
sudo apt install bridge-utils

# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto br0
iface br0 inet static
	address 192.168.0.22
    netmask 255.255.255.0
	gateway 192.168.0.1
	dns-nameservers 192.168.0.1
	bridge_ports eth0
	bridge_fd 0
	bridge_hello 2
	bridge_maxage 0
	bridge_ageing 0
	bridge_maxwait 0
	bridge_stp off

多网卡 负载均衡 bonding 加 bridge


# 确保安装  ifenslave bridge-utils
sudo apt install ifenslave bridge-utils

# /etc/network/interfaces

auto lo
iface lo inet loopback

auto bond0
iface bond0 inet manual
	bond-mode 0
	# bond-mode 4
	bond-lacp-rate fast
	bond-miimon 100
	post-up ifup eth0 eth1

iface eth0 inet manual
	bond-master bond0
	bond-primary eth0

iface eth1 inet manual
	bond-master bond0

auto br0
iface br0 inet static
	address 192.168.0.22
	netmask 255.255.255.0
	gateway 192.168.0.1
	dns-nameservers 192.168.0.1
	bridge_ports bond0
	bridge_fd 0
	bridge_hello 2
	bridge_maxage 0
	bridge_ageing 0
	bridge_maxwait 0
	bridge_stp off

lxd使用该bridge


# 基于 bridge-utils 的网络配置
dpkg-reconfigure -p medium lxd
# Would you like to setup a network bridge for LXD containers now? 
NO
#  Do you want to use an existing bridge? 
YES
# Bridge interface name: 
# 自己建的bridge名称
br0
# 完成
'OK'

drupal 8 nginx 配置

分类

使用nginx 官方Drupal 配置仍然有问题

更新模块时会提示类似于提示类似于


An AJAX HTTP error occurred.
HTTP Result Code: 403
Debugging information follows.
Path: /core/authorize.php/core/authorize.php?batch=1&id=2&op=do_nojs&op=do
StatusText: Forbidden
ResponseText:
403 Forbidden
403 Forbidden

这样的信息,解决方法是在

location ~ \..*/.*\.php$ { return 403; }

上方添加一行:

rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

就可以了