泉州师范学院论坛

 找回密码
 注册会员

扫一扫,访问微社区

查看: 38|回复: 0

Discuz3论坛使用CDN后获取真实IP的解决方法QQ登录

[复制链接]
剑指寒江 发表于 2019-9-6 09:38:15 | 显示全部楼层 |阅读模式
DZ论坛开启CDN,QQ互联登录登录不上了。具体来说CDN等于一个反向代理。而QQ登录需要获取用户的真实IP,要不使用mod_cloudflare模块。NGINX改LUA也能用,让PHP读取真实IP

论坛升级成DISCUZx3之后获取的IP地址总是不正确导致以下莫名其妙的问题,解决方法如下:打开\source\class\discuz\discuz_application.php文件,找到_get_client_ip(大约360行)方法。将代码改为:
  1. private function _get_client_ip() {
  2. $ip = $_SERVER['REMOTE_ADDR'];
  3. if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  4. $ip = $_SERVER['HTTP_CLIENT_IP'];
  5. } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  6. foreach ($matches[0] AS $xip) {
  7. if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  8. $ip = $xip;
  9. break;
  10. }
  11. }
  12. }
  13. return $ip;
  14. }
复制代码

改成
  1. private function _get_client_ip() {
  2. $ip = $_SERVER['REMOTE_ADDR'];
  3. if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {
  4. $ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];
  5. }
  6. elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) {
  7. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  8. }
  9. elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  10. $ip = $_SERVER['HTTP_CLIENT_IP'];
  11. }
  12. return $ip;
  13. }
复制代码


然后到CDN 和  DZ后台。分别清理缓存。


=============保留参数方法==================================

查源码Oauth.php(原Oauth.class.php)发现问题出在防CSRF攻击的state上。再次尝试登录,看了下地址栏callback后的code参数和state参数一切正常。也就是说授权动作执行完成了。那么问题就出在这个比对问题上了,我是通过TP5的助手函数input获取的state。尝试dump了一下state和code。都显示为空,没有获取到地址栏上的参数,无法和程序中的state变量比对,造成的错误。以为是助手函数的问题,又原本请求了一次,还是没有,最后使用原生$_GET也还是没有请求到内容。

地址栏上的信息是被构造出来的,那么访问的数据是CDN节点缓存给我的,地址栏的数据没有和源站产生交互,CDN配置的时候的参数过滤问题了。阿里云的CDN有保留参数回源的设置,竟然忘了这一出。迅速进入阿里云CDN控制面板,在域名管理里面,过滤参数中设置好保留的code和state两个参数。刷新页面后重新使用QQ登录,就一切正常了。


10.jpg

=======================================

使用CDN后如何获取Nginx服务的真实IP地址。


Nginx服务使用CDN后,用户访问的IP地址不真实,怎样获取真实的IP地址。

在Nginx服务的配置文件内location配置项添加如下内容,就可以获取到Nginx服务的真实IP地址。

  1. location / {
  2. proxy_pass http://vs_service;
  3.       index index.html index.htm index.jsp index.shtml;
  4.       proxy_redirect off;
  5.       proxy_set_header Host $host;
  6.       proxy_set_header X-Real-IP $remote_addr;
  7.       proxy_set_header REMOTE-HOST $remote_addr;
  8.       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9.     }
复制代码



-------===================================

Apache日志中获取访客真实IP的解决方案

Windows 2003 Server + Apache 解决方案:

1、打开文件:\apache\conf\httpd.conf。

2、在文件中查找:”CustomLog”,找到如下配置块: 查看到当前使用的LogFormat为”combined”(如果实际启用的为其他日志格式,替换相应的格式定义即可)。

3、在文件中查找:”LogFormat”,找到如下配置块(combined格式定义):

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

将其修改为:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"  \"%{X-Forwarded-For}i\"" combined

4、保存并关闭文件\apache\conf\httpd.conf。

5、重启Apache服务。



Linux + Apache 解决方案:

1、打开文件:/etc/httpd/conf/httd.conf。

2、在文件中查找:”CustomLog”,找到如下配置块: 查看到当前使用的LogFormat为”combined” (如果实际启用的为其他日志格式,替换相应的格式定义即可)。


#
# For a single logfile with access, agent, and referer information
# (Combined Logfile Format), use the following directive:
#
CustomLog  logs/access_log combined

3、在文件中查找:”LogFormat”,找到如下配置块(combined格式定义):

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

将其修改为:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\" " combined

4、保存并关闭文件/etc/httpd/conf/httd.conf。

5、重启Apache服务。


===================================

Nginx日志中获取访客真实IP的解决方案

解决方案如下:

1、打开文件:/etc/nginx/nginx.conf。

2、在文件中查找:”CustomLog”,找到如下配置块:

server {
        listen   80; ## listen for ipv4
        listen   [::]:80 default ipv6only=on; ## listen for ipv6
        server_name  localhost;
        access_log  /var/log/nginx/localhost.access.log main;

3、将access_log这一行替换为如下内容:

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/localhost.access.log  main;

4、保存并关闭文件/etc/nginx/nginx.conf。

5、重启Nginx服务。





泉州师院论坛域名: www.Qzubbs.com 手机浏览器照样访问。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

关于我们|免责声明|学校风景|企业招聘|二手市场|违规帐号|手机论坛|手机论坛|京ICP备10001858号|广告联系

Copyright 1958-2018 泉州大学 泉州师范学院 - 相聚西岸阳光,相遇、相识、相知;一起邂逅骄傲,梦想,未来!

GMT+8, 2019-9-18 16:09 , Processed in 0.044950 second(s), 11 queries , Gzip On, MemCached On.

快速回复 返回顶部 返回列表