被一个小小的冒号戏弄了一个上午

博客记述了在阿里云VPC环境下,通过haproxy负载均衡器转发流量时出现503错误的问题排查过程,最终发现是由于index.php文件中使用了中文冒号导致。

                              作者:田逸(sery@163.com)

有一个用阿里云的哥们来电,告知把云主机绑上弹性公网ip,访问其上的网站,正常;但把弹性公网ip解绑,用前端的haproxy转发,就报503错误。怎么实验都不行,于是我只好亲自上阵。


wKiom1ftDc-zPj2AAACPu-AuRPs491.jpg-wh_50

说明:阿里云vpc实例给的是私有ip,可以根据需要随时绑定公网ip。在本例中,调度器为haproxy,通过阿里云管理后台绑定了公网ip,同样,网络管理入口的实例也绑定了弹性公网ip。


我考虑的第一步,是先保证转发器后端的服务是正常的。后端服务为nginx + php,数据库单独,还需要连mongodb。


通过vpn拨号,连入内网,检查nginx和php的各项配置,跟别的机器参照对比,也没看见什么问题。然后,在本地的windows里边,对hosts文件进行域名和ip绑定处理,接着用浏览器访问站点,是正常的!由此可以基本确认nginx、php等没有问题,那么可能有问题的地方就在haproxy上边了。


登录haproxy所在实例,检查防火墙、seliux等,都是正常的。打开haprxoy配置文件,是照着前边的项目形式追加的,格式完全一样,也找不出问题所在。

wKiom1ftE1bzRDrxAAIuzJnv810354.jpg-wh_50

部分配置省略(不影响阅读)

wKiom1ftFEfTV-VtAAKzeldfdhI151.jpg-wh_50


尝试开启状态监控,从haproxy的状态监控页面看,是有请求通过啊。又担心是机房白名单的问题,去备案网站查询,有备案许可。再把该实例绑定弹性公网ip,用此ip绑定域名,访问确实是正常的,这可以证明,应该不是备案或者白名单的问题了。我有寻思,是不是php哪里有问题?就打开nginx配置文件,找到该站点的根文档位置,在它的下边写了个test.php,内容为“<? phpinfo(); ?>”,访问请求经过haproxy居然可以访问到站点,但其它页面就不行,好邪门呢!


试了好多种方法,大半天过去了,还是没进展。我看小毛qq在线,就请他帮我搞一下。后来他把问题解决了,告诉我是index.php里边,有一行代码的冒号,用的是中文字符,改成英文的,一试,马上正常了。

wKiom1ftGJGzu4SOAALt9wjk9a4759.jpg-wh_50

这个错误,通过haproxy转发的时候,问题就出来了,但直接浏览器访问,就不会有这样的问题。感谢小毛的帮忙,不然我还真查不到这个细小的问题所在。

















本文转自sery51CTO博客,原文链接:http://blog.51cto.com/sery/1857923 ,如需转载请自行联系原作者



<think>在编程中,冒号(:)和双冒号(::)的使用场景和含义有显著区别,具体取决于语言环境。以下是主要差异的总结: ### 一、单冒号(:)的常见用途 1. **条件语句(三目运算符)** ```c int max = (a > b) ? a : b; // 若a>b则取a,否则取b ``` 2. **循环/分支标签(如C/C++/Java)** ```java loop: for (int i=0; i<10; i++) { break loop; } // 标记循环 ``` 3. **结构体/类初始化列表(C++)** ```cpp class MyClass : public Base { // 继承基类 public: MyClass(int x) : val(x) {} // 成员初始化列表 }; ``` 4. **切片操作(Python)** ```python arr[1:5] # 取数组索引1到4的元素 ``` 5. **键值对分隔(JSON/字典)** ```json {"name": "Alice", "age": 30} ``` ### 二、双冒号(::)的常见用途 1. **作用域解析运算符(C++/Java/PHP)** ```cpp std::cout << "Hello"; // 访问std命名空间的cout MyClass::staticMethod(); // 调用类的静态方法 ``` 2. **全局作用域访问(C++)** ```cpp ::globalVar = 10; // 明确指定全局变量 ``` 3. **类方法定义(C++)** ```cpp void MyClass::method() { /* 实现 */ } // 类外定义成员函数 ``` 4. **命名空间别名(C++)** ```cpp namespace fs = std::filesystem; // 创建别名 ``` ### 三、关键区别总结 | 符号 | 典型场景 | 语言示例 | 核心作用 | |------|------------------------|----------------|------------------------------| | `:` | 初始化列表/继承 | C++ | 构造派生类或初始化成员 | | `:` | 三目运算符 | C/Java/JS | 条件分支选择 | | `:` | 切片操作 | Python | 序列截取 | | `::` | 作用域解析 | C++/PHP | 访问命名空间/类静态成员 | | `::` | 静态方法调用 | Java (Class::method) | 方法引用 | §§相关问题§§ 1. 在C++成员初始化列表中,单冒号(:)的使用有哪些必须遵循的语法规则? 2. Python中的切片操作符[:]是否可以扩展至自定义类?如何实现? 3. 为什么Java允许使用双冒号(::)进行方法引用,而C#使用点号(.)? 4. 在多重继承的C++类中,双冒号(::)如何解决基类成员名冲突问题? 5. JSON格式中冒号(:)作为键值对分隔符,其设计背后的逻辑是什么?</think>在编程中,冒号(`:`)和双冒号(`::`)是两种完全同的运算符,其区别主要体现在以下方面: ### 一、单冒号(`:`)的核心用途 1. **继承关系声明** ```cpp class Derived : public Base { ... }; // 表示Derived继承自Base ``` 2. **类成员初始化列表** ```cpp MyClass::MyClass() : m_value(0) { ... } // 初始化成员变量 ``` 3. **三目运算符分隔符** ```c int max = (a > b) ? a : b; // 条件为真取a,否则取b ``` 4. **位域定义** ```cpp struct BitField { unsigned int flag : 1; }; // 1位长度的位域 ``` 5. **标签声明** ```c goto label; // 跳转标签声明 label: printf("Jumped"); ``` ### 二、双冒号(`::`)的核心用途 1. **作用域解析运算符** ```cpp std::cout; // 访问std命名空间的cout MyClass::staticVar; // 访问类的静态成员 ``` 2. **全局作用域指定** ```cpp ::globalVar = 10; // 明确访问全局变量(避免与局部变量冲突) ``` 3. **类外成员定义** ```cpp void MyClass::method() { ... } // 在类外部定义成员函数 ``` ### 三、关键区别总结 | 特性 | 单冒号 `:` | 双冒号 `::` | |--------------|-------------------------------------|-------------------------------------| | **主要作用** | 建立关系(继承/初始化) | 作用域解析(命名空间/类/全局) | | **操作对象** | 类型或变量 | 命名空间或类 | | **典型场景** | 类继承、成员初始化、三目运算符 | 访问静态成员、调用全局函数 | | **语言支持** | C/C++/Java/C#/Python(切片等特殊用法) | 主要C++特有,Java/C#用点号(.)替代 | | **内存影响** | 直接涉及内存访问 | 可能触发静态存储区的数据访问 | > **示例对比**: > ```cpp > class B : public A { // 单冒号:继承 > public: > B() : data(0) { } // 单冒号:成员初始化 > static void f(); > private: > int data; > }; > void B::f() { // 双冒号:类外定义 > ::printf("Global scope"); // 双冒号:访问全局函数 > } > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值