web服务器经过代理后的绝对路径问题,以及 dirname(__FILE__)和__DIR__

web服务器经过代理后的绝对路径问题,以及 dirname(__FILE__)和__DIR__

  • 问题描述
  • 情况解析
      • 资源路径分析
      • 访问过程分析
  • dirname(\_\_FILE\_\_) 与 \_\_DIR\_\_

同步发布在个人笔记web服务器经过代理后的绝对路径问题,以及 dirname(__FILE__)和__DIR__

问题描述

我有一个部署在自家网络的服务器,为了实现在公网也可以访问(内网穿透),我把web服务通过公网服务器上的 nginx + frp 方案进行了反向代理。实现方式参考这篇文章NGINX配合SSH/FRP反向代理实现内网穿透。
于是在某次使用绝对路径访问文件时,无论如何使用本地服务器上的绝对路径都无法成功访问。(确定内网服务器上的绝对路径是正确的)

情况解析

原因是当我们通过公网服务器的代理服务访问内网服务器上的资源时,如果使用的是内网服务器上的绝对路径,由于套了一层壳,是不能正常访问的。访问者以为的绝对路径将是公网服务器路径与内网服务器路径的一个结合

资源路径分析

以我的情况举例,使用图表展示的更清晰些。

内网服务器公网服务器
文件名yourplugin.phpdefault.conf
文件路径/home/user/wordpress/wp-content/plugins//var/www/html
路径拆分根目录:/home/user/wordpress/ 下级目录:wp-content/plugins/根目录:/var/www/html/

内网服务器中需要注意的是(以 wordpress 项目为例),项目的根目录是一定的,项目不同资源分布在根目录下的不同下级目录中。
公网服务器中关键的是 nginx 配置文件中设置的 root 位置,我的设置是 /var/www/html。具体可见NGINX 多域名访问多端口应用。

访问过程分析

以上文情况举例,我想访问 wordpress 项目下的 yourplugin.php 文件,需要使用下面这个 url。
URL:https://www.domain.com/wordpress/yourplugin

域名后续字段
URLwww.domain.comwordpress/yourplugin
资源路径根目录下级目录

当我们通过 url 来访问 web 资源时,域名(形如 www.domain.com)被 nginx 等 web 程序解析到根目录的位置;后续字段代表的是资源所在的下级目录。这样我们才可以通过 url 从世界各地都能访问到特定服务器上的特定文件。
此时关注内网穿透情况下的访问过程:

域名/根目录
后续字段/下级目录
用户
公网服务器
内网服务器
资源文件

此时路径结构就清晰了,考虑绝对路径 = 根目录 + 下级目录,注意此时根目录是在公网服务器上解析的,下级目录是在内网服务器上解析的,所以:
内网穿透下绝对路径 = 公网服务器根目录 + 内网服务器下级目录
参考文章第一个表格,重要路径已经粗体强调,yourplugin.php 的绝对路径应该为:/var/www/html/wp-content/plugins/yourplugin.php

dirname(__FILE__) 与 __DIR__

通过上述解析我们的确可以对每个资源都设置出可用的绝对路径,但是在编程时采取此法则不甚明智。因为一些项目迁移等原因很容易使得路径失效,并且也不方便。
在 php 中,我们可以使用 dirname(__FILE__) 和 __DIR__ 来方便的获取当前资源的绝对路径。

  • dirname(__FILE__)
    获取当前资源所在的目录的绝对路径,例如/var/www/html/wp-content/plugins
  • __DIR__
    获取当前资源本身的绝对路径,例如/var/www/html/wp-content/plugins/yourplugin.php

常用方法:

#如果只是想调用这个文件本身,那么可以使用:
$filepath = __DIR__;#如果是想访问当前文件同一目录下的资源,那么可以使用:
$filepath = dirname(__FILE__) . '/text.txt'; #注意后缀的字符串需要有 / 。因为dirname最后一位不是 / ,需要我们补全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nest.js 实战 (一):使用过滤器优雅地统一处理响应体

前言 在我们实际的业务开发中,我们可以看到后端接口返回格式都有一定的要求,假如我们统一规定接口的统一返回格式为: {data: any; // 业务数据code: number; // 状态码msg: string; // 响应信息timestamp: number; // 时间戳 }那么在 Nest.…

【智能算法改进】改进的麻雀搜索算法及其求解旅行商问题

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及实现 2.改进点 改进发现者更新位置 为了使 SSA 算法能够避开向原点收敛的弊端, 将算法向最优位置跳跃的操作转换为向最优位置的移动: X i ,…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目,主管丢给我一个任务,说要支持滑动验证码。我身为50岁的软件攻城师,当时正背着双手,好像一个受训的保安似的,中规中矩地参加每日站会,心想滑动验证码在今时今日已经是标配了,司空…

一个篇文章告诉你一个APP前端搭建有多简单

用uni-app 1.新建uni-app项目 点击项目 2.创建 最后点击右下方创建 3.添加tarbar 首先你要创建几个页面这里比如说我有两个页面的tarbar首页(home)和我的(userIndex) 在pages目录下右键新建页面即可

从库存超卖问题分析锁和分布式锁的应用(二)

本文从一个经典的库存超卖问题分析说明常见锁的应用,假设库存资源存储在Redis里面。 假设我们的减库存代码如下: Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

JavaSE从零开始到精通

1.前置知识 JVM:java virtrual machine, java虚拟机, 专门用于执行java代码的一款软件。JRE:java runtime enviroment, java运行时环境, java官方提供的核心类库. jre中包含了核心类库和jvm。JDK: java development kit, java开发工具包, javac.exe, ja…

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换,主在工作时,vip地址只在主上,vip漂移到备服务器。 在主备的优先级不变的情况下,主恢复工作,vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析,但我就是不想学编程。” “我又不是生信狗,学代码会死。” “你们这些做生信的,整天把数据分析搞得神神秘秘,不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果,不靠谱。” “你们做…

【自学安全防御】二、防火墙NAT智能选路综合实验

任务要求: (衔接上一个实验所以从第七点开始,但与上一个实验关系不大) 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总…

使用Docker创建并运行一个create-react-app应用(超简单)

创建并运行一个使用 Create React App (CRA) 创建的应用程序的 Docker 容器涉及几个步骤。以下是一个详细的过程,包括创建一个简单的 React 应用、编写 Dockerfile、构建镜像以及运行容器。 步骤 1: 创建一个新的 React 应用 如果你还没有一个 React 应用&#xf…

Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截

摘要 在当今互联网时代,数据采集已成为获取信息的重要手段。然而,随着反爬虫技术的不断进步,爬虫开发者面临着越来越多的挑战。本文将探讨Java爬虫在抓取TikTok音频时的安全策略,包括如何防止请求被拦截,以及如何提高…

RK3568 安卓12 EC20模块NOCONN没有ip的问题(已解决)

从网上东拼西凑找了不少教程,但是里面没有提到rillib.so需要替换,替换掉就可以上网了,系统也有4G图标了。 注意,这个rillib.so是移远提供的。把他们提供的文件放到rk3568_android_sdk/vendor/rockchip/common/phone/lib下&#x…

Andriod Stdio新建Kotlin的Jetpack Compose简单项目

1.选择 No Activity 2.选择kotlin 4.右键选择 在目录MyApplication下 New->Compose->Empty Project 出现下面的画面 Finish 完成

C++——类和对象(中)

文章目录 一、类的默认成员函数二、构造函数三、析构函数四、拷⻉构造函数五、赋值运算符重载1. 运算符重载2. 赋值运算符重载 六、取地址运算符重载const成员函数取地址运算符重载 七、应用:⽇期类实现Date.hDate.cpptest.cpp 一、类的默认成员函数 默认成员函数就…

技术成神之路:设计模式(七)状态模式

1.介绍 状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。这个模式将状态的相关行为封装在独立的状态类中,并将不同状态之间的转换逻辑分离开来。 2.主要作用 状态模式的主要作用是让一个…

数据结构—链式二叉树-C语言

代码位置:test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言: 在现实中搜索二叉树为常用的二叉树之一,今天我们就要通过链表来实现搜索二叉树。实现的操作有:建二叉树、前序遍历、中序遍历、后序遍历、求树的节点个数、求…

SMU Summer 2024 Contest Round 4

SMU Summer 2024 Contest Round 4 2024.7.16 9:00————11:00 过题数3/7 补题数6/7 Made Up H and V Moving Piece Sum of Divisors Red and Green Apples Rem of Sum is Num Keep Connect A - Made Up 题解: 给定三个数组a,b,c&#xf…

MySQL日期和时间相关函数

目录 1. 获取当前时间和日期 2. 获取当前日期 3. 获取当前时间 4. 获取单独的年/月/日/时/分/秒 5. 添加时间间隔 date_add ( ) 6. 格式化日期 date_format ( ) 7. 字符串转日期 str_to_date () 8. 第几天 dayofxx 9. 当月最后一天 last_day ( ) 10. 日期差 datedif…

H. Beppa and SwerChat【双指针】

思路分析&#xff1a;运用双指针从后往前扫一遍&#xff0c;两次分别记作数组a&#xff0c;b&#xff0c;分别使用双指针i和j来扫&#xff0c;如果一样就往前&#xff0c;如果不一样&#xff0c;i–,ans #include<iostream> #include<cstring> #include<string…

SQL server 练习题2

课后作业 作业 1&#xff1a;自己查找方法&#xff0c;将 homework_1.xls 文件数据导入到 SQLServer 的 homework 数据库中。数据导入完成后&#xff0c;把表名统一改为&#xff1a;外卖表 如下所示&#xff1a; 作业 2&#xff1a;找出所有在 2020 年 5 月 1 日至 5 月 31 …