AJAX 请求区分 $_SERVER['HTTP_X_REQUESTED_WITH']

本文解析了PHP中$_SERVER变量的工作原理,重点介绍了如何利用自定义Header信息如$_SERVER['HTTP_X_REQUESTED_WITH']来判断AJAX请求,并探讨了服务器端与客户端间的数据交换方式。
受到很多模版代码的影响,大家都以为php有这样一个自定义变量:$_SERVER['HTTP_X_REQUESTED_WITH'].  其实根本不是那么回事.
$_SERVER是一个包含诸如头信息(header),路径(path)和脚本位置(script locations)的数组.这是PHP手册的原话.

有 一些头信息是系统本身就存在的,且不能更改,比如说HOST,USER_AGENT等等,注意我们常用到的 是$_SERVER['HTTP_HOST'],$_SERVER['HTTP_USER_AGENT'],这里面都有HTTP前缀,实现上在 header信息里面是没有HTTP前缀的,信息名称只是HOST之类的,$_SERVER自动的为他们加上HTTP前缀,1是为了防止与本身的其它信息 相冲突,2是为了表示他们是header头部的信息.所以$_SERVER中的变量凡是带有HTTP前缀的均是header信息,没有的则不是, 如:$_SERVER['QUERY_STRING'], $_SERVER['PHP_SELF']等.

用户可以创建自定义的header头部信息,并把这些信息发送给服务器端, 服务器端就会记录这些header信息,并把他们存储到$_SERVER变量中,当然实现的变量名称变成了"HTTP_"连上用户的变量名称.比如上面的 判断ajax请求.实际上是在向服务器发送异步请求之前,向header中加入一条header信息,实际的语句应该是:

HttpRequest 对象.setRequestHeader("X_REQUESTED_WITH","任意字符串");服务器端通 过$_SERVER['HTTP_X_REQUESTED_WITH']这个变量是否存在,或具体的值来判断是否是ajax请求或具体是哪一条ajax请 求.  所以利用这个不但可以验证请求是否是ajax请求,还可以获取更多的信息.

同样我们可以在header中任意设置其它的信息,用于跟服务器端进行数据交流.

比 如:xmlHttpRequest.setRequestHeader("test","just a test");  那么被请求的服务器页面中的变量$_SERVER['HTTP_TEST']的值就是"just a test"; 注意这里面前面的test不固定大小写.后面的$_SERVER['HTTP_TEST']必须是大写.
Autoconf 是一个广泛使用的工具,用于自动化配置软件的构建过程。当涉及到 systemd 支持时,Autoconf 的主要任务是检测系统环境中 systemd 的存在性,并根据检测结果配置相关的 systemd 服务文件安装路径。 在 systemd 支持的配置过程中,`systemdsystemunitdir` 是一个重要的变量,它用于指定 systemd 系统单元文件(如 `.service` 文件)的安装目录。通常情况下,systemd 的系统单元文件默认安装在 `/usr/lib/systemd/system` 或 `/etc/systemd/system` 目录下。Autoconf 通过 `configure.ac` 脚本中的逻辑来检测这些路径,并在编译时动态设置它们。 ### Autoconf 配置逻辑解析 1. **检测 systemd 的存在性** Autoconf 使用 `PKG_CHECK_MODULES` 宏来检查系统中是否安装了 systemd 开发库。例如: ```m4 PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 183], [ systemd_support=yes ], [ systemd_support=no ]) ``` 如果检测到 systemd,则启用 systemd 支持;否则,跳过 systemd 相关的配置[^1]。 2. **设置 systemd 单元文件目录** 如果 systemd 支持被启用,Autoconf 会尝试确定 `systemdsystemunitdir` 的值。这通常通过 `AC_ARG_WITH` 宏来实现,允许用户在运行 `configure` 时显式指定路径: ```m4 AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd system unit files]), [systemdsystemunitdir="$withval"], [systemdsystemunitdir='${prefix}/lib/systemd/system']) ``` 如果用户未指定路径,则默认使用 `${prefix}/lib/systemd/system`。`prefix` 通常是 `/usr`,因此最终路径可能是 `/usr/lib/systemd/system`。 3. **将配置传递给 Makefile** 配置完成后,`systemdsystemunitdir` 的值会被写入 `Makefile` 中,确保在安装阶段,服务文件会被正确复制到目标目录。例如: ```makefile systemdsystemunitdir = $(prefix)/lib/systemd/system dist_systemdsystemunit_DATA = myservice.service ``` 在运行 `make install` 时,`myservice.service` 文件会被安装到 `$(systemdsystemunitdir)` 指定的目录中。 4. **服务文件的编写** systemd 服务文件通常包含服务的描述、启动命令、依赖关系等信息。例如: ```ini [Unit] Description=My Custom Service After=network.target [Service] ExecStart=/usr/bin/myprogram Restart=always [Install] WantedBy=multi-user.target ``` 该文件需要在源代码树中定义,并通过 `dist_systemdsystemunit_DATA` 指令确保其被安装到正确的位置[^1]。 ### systemd 支持的验证方法 1. **检查 configure 输出** 在运行 `./configure` 时,应留意输出信息,确认是否检测到 systemd 并启用了支持。例如: ``` checking for libsystemd >= 183... yes checking systemd support... yes ``` 2. **验证 Makefile 中的路径** 检查生成的 `Makefile`,确认 `systemdsystemunitdir` 是否指向预期的目录。例如: ``` systemdsystemunitdir = /usr/lib/systemd/system ``` 3. **检查安装过程** 在运行 `make install` 时,观察输出信息,确认服务文件是否被正确安装到 `systemdsystemunitdir` 指定的路径中。 4. **验证 systemd 服务** 安装完成后,可以使用以下命令检查服务是否被正确加载: ```bash systemctl daemon-reload systemctl enable myservice.service systemctl start myservice.service systemctl status myservice.service ``` 如果服务能够正常启动并运行,则说明 systemd 支持配置成功。 ### 示例配置代码 以下是一个完整的 `configure.ac` 片段,展示了如何检测 systemd 并配置 `systemdsystemunitdir`: ```m4 dnl Check for systemd support PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 183], [ systemd_support=yes ], [ systemd_support=no ]) if test "x$systemd_support" = "xyes"; then AC_DEFINE([HAVE_SYSTEMD], [1], [Define if systemd support is enabled]) fi AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd system unit files]), [systemdsystemunitdir="$withval"], [systemdsystemunitdir='${prefix}/lib/systemd/system']) ``` ### Makefile.am 示例 ```makefile if HAVE_SYSTEMD systemdsystemunitdir = $(with_systemdsystemunitdir) dist_systemdsystemunit_DATA = myservice.service endif ``` ### 总结 Autoconf 的 systemd 支持逻辑主要围绕检测 systemd 开发库、配置服务文件路径以及确保服务文件在安装时被正确放置。通过合理的 `configure.ac` 和 `Makefile.am` 配置,可以实现对 systemd 系统单元文件的自动化管理。验证时可以通过检查配置输出、安装路径和服务运行状态来确认配置是否成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值