- Accept
- 浏览器可接受的MIME类型。
- Connection
- 表示是否需要持久连接
- 中文名
- http请求头
-
2022-02-22 20:39:35
什么是HTTP请求头
HTTP请求头是HTTP 协议的重要组成部分。它们定义了 HTTP 消息(请求或响应)并允许客户端和服务器与消息交换可选的元数据。它们由不区分大小写的头字段名称后跟一个冒号,然后是头字段值组成。标题字段可以扩展到多行,方法是在每一额外行前至少有一个空格或水平制表符。标题可以根据其上下文进行分组:
- 请求头:HTTP 请求请求头用于提供有关正在获取的资源和发出请求的客户端的附加信息。
- 响应头:HTTP 响应头提供有关响应的信息。
以下是 HTTP 请求请求头中包含的主要信息:
- IP 地址(来源)和端口号。
- 请求的网页的 URL。
- Web 服务器或目标网站(主机)。
- 浏览器将接受的数据类型(文本、html、xml 等)。
- 发送兼容数据的浏览器类型(Mozilla、Chrome、IE)。
- 作为响应,包含请求数据的 HTTP 响应请求头由 发回。
需要更改HTTP请求请求头
以下是测试工作中可能需要更改 HTTP 请求请求头的一些场景:
通过建立适当的 HTTP 请求头来测试控制、测试不同的版本。
需要对 Web 应用程序的不同方面甚至服务器逻辑进行彻底测试的情况。
由于 HTTP 请求请求头用于启用 Web 应用程序逻辑的某些特定部分,通常在正常模式下会禁用这些部分,因此根据测试场景,可能需要不时修改 HTTP 请求请求头。
在被测 Web 应用程序上测试访客模式是测试人员可能需要修改HTTP请求请求头的情况。但是SeleniumRC曾经支持的修改HTTP请求头的功能,现在Selenium Webdriver不处理了。
Selenium修改请求头
Selenium Java中修改请求头请求的多种方法。大体上,有几种可能,接下来可以修改 Java-Selenium 项目中的头请求。
- 使用Java HTTP请求框架。
- 使用反向代理。
- 使用 Firefox 浏览器扩展。
Java HTTP请求框架
与 Selenium 一起,我们可以使用 REST Assured,它是一种以简单方式使用 REST服务的绝佳工具。为项目配置 REST Assured教程非常简单,这里就不介绍了。让我们考虑以下场景:
- 我们有一个名为 RequestHeaderChangeDemo 的 Java 类,我们在其中维护基本配置
- 我们有一个名为 TestSteps 的测试步骤文件,我们将在其中调用
RequestHeaderChangeDemo Java 类中的方法,通过这些方法我们将执行我们的测试。
观察下面名为 RequestHeaderChangeDemo 的 Java 类。BASE_URL是应用了以下四种方法的网站:
- 认证用户
- 获取产品
- 添加产品
- 移除产品
public class RequestHeaderChangeDemo {
private static final String BASE_URL = "https://****";
public static IRestResponse<Token> authenticateUser(AuthorizationRequest authRequest) {
RestAssured.baseURI = BASE_URL;
RequestSpecification request = RestAssured.given();
request.header("Content-Type", "application/json");Response response = request.body(authRequest).post(Route.generateToken());
return new RestResponse(Token.class, response);
}此处省略部分重复代码
在上面的Java类文件中,我们在每个连续的方法中重复发送了BASE_URL和headers。示例如下所示:
RestAssured.baseURI = BASE_URL;
RequestSpecification request = RestAssured.given();
request.header("Content-Type", "application/json");
Response response = request.body(authRequest).post(Route.generateToken());request.header方法请求 JSON 格式的请求头。有大量的代码重复,这降低了代码的可维护性。如果我们在构造函数中初始化RequestSpecification对象并使这些方法非静态(即创建实例方法),则可以避免这种情况。由于 Java 中的实例方法属于类的 Object 而不是类本身,因此即使在创建类的 Object之后也可以调用该方法。与此同时,我们还将重写实例方法。
将方法转换为实例方法有以下优点:
- 身份验证仅在一个 RequestSpecification 对象中进行一次。不再需要为其他请求创建相同的请求。
- 灵活修改项目中的请求头。
因此,让我们看看当我们使用实例方法时 Java 类 RequestHeaderChangeDemo 和测试步骤文件 TestSteps 。
带有实例方法的RequestHeaderChangeDemo 类的 Java 类
public class RequestHeaderChangeDemo {
private final RequestSpecification request;
public RequestHeaderChangeDemo(String baseUrl) {
RestAssured.baseURI = baseUrl;
request = RestAssured.given();
request.header("Content-Type", "application/json");
}public void authenticateUser(AuthorizationRequest authRequest) {
Response response = request.body(authRequest).post(Route.generateToken());
if (response.statusCode() != HttpStatus.SC_OK)
throw new RuntimeException("Authentication Failed. Content of failed Response: " + response.toString() + " , Status Code : " + response.statusCode());Token tokenResponse = response.body().jsonPath().getObject("$", Token.class);
request.header("Authorization", "Bearer " + tokenResponse.token);
}public IRestResponse<Products> getProducts() {
Response response = request.get(Route.products());
return new RestResponse(Products.class, response);
}
此处省略部分代码
}代码实战
我们创建了一个构造函数来初始化包含 BaseURL 和请求请求头的 RequestSpecification 对象。
早些时候,我们必须在每个请求请求头中传递令牌。现在,一旦我们在方法authenticateUser() 中收到令牌响应,我们就将它放入请求的同一个实例中。这使测试步骤的执行能够向前推进,而无需像之前那样为每个请求添加令牌。这使得请求头可用于对服务器的后续调用。
现在将在 TestSteps 文件中初始化这个 RequestHeaderChangeDemo Java 类。我们根据 RequestHeaderChangeDemo Java 类中的更改更改 TestSteps 文件。
public class TestSteps
{
private final String USER_ID = "";
private Response response;
private IRestResponse<UserAccount> userAccountResponse;
private Product product;
private final String BaseUrl = "https://******";
private RequestHeaderChangeDemo endPoints;
@Given("^User is authorized$")
public void authorizedUser()
{
endPoints = new RequestHeaderChangeDemo (BaseUrl);
AuthorizationRequest authRequest = new AuthorizationRequest("(Username)", "(Password)");
endPoints.authenticateUser(authRequest);
}
@Given("^Available Product List$")
public void availableProductLists()
{
IRestResponse<Products> productsResponse = endPoints.getProducts();
Product = productsResponse.getBody().products.get(0);
}
@When("^Adding the Product in Wishlist$"){
ADDPROD code = new ADDPROD(product.code);
AddProductsRequest addProductsRequest = new AddProductsRequest(USER_ID, code);
userAccountResponse = endPoints.addProduct(addProductsRequest);
}
}
这是我们在修改后的实现中所做的:
- 初始化 RequestHeaderChangeDemo 类对象作为端点。
- BaseURL 是在第一个方法(即authorizedUser)中传递的。
- 在方法authorizedUser 中,我们调用了RequestHeaderChangeDemo 类的构造函数authenticateUser。
- 因此,后续步骤定义使用相同的端点对象。
使用反向代理
顾名思义,在 Java-Selenium 自动化测试套件中处理请求请求头更改时,我们可以选择使用代理。由于 Selenium 禁止在浏览器和服务器中注入信息,因此可以使用代理进行处理。如果测试是在公司防火墙后面执行的,则这种方法不是首选。作为 Web 基础架构组件,代理通过将自身定位在客户端和服务器之间来使 Web 流量通过它。代理的工作方式类似,使流量通过它,允许安全的流量通过并阻止潜在威胁。代理具有部分或完全修改请求和响应的能力。
核心思想是发送授权请求头,绕过包含凭证对话的阶段,也称为基本认证对话。然而,结果证明这是一个累人的过程,尤其是在测试用例需要频繁重新配置的情况下。
这就是浏览器 mob-proxy 库的用武之地。让我们看看如何将浏览器 mob-proxy 与使用基本身份验证保护的示例网站一起使用。为了解决这个问题,我们可能会缩小两种可能的方法:
- 向所有请求添加授权请求头,没有条件或例外。
- 仅向满足特定条件的请求添加请求头。
尽管我们不会解决请求头管理问题,但我们仍将演示如何在浏览器 mob-proxy 授权工具集的帮助下解决授权问题。在 Selenium Java 教程的这一部分中,我们将只展示了第一种方法(即向所有请求添加授权请求头)。
首先我们在pom.xml中添加browsermob-proxy的依赖
<dependencies>
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core</artifactId>
<version>2.1.5</version>
<scope>test</scope>
</dependency>
</dependencies>
然后需要在代码做一些改造:public class caseFirstTest
{
WebDriver driver;
BrowserMobProxy proxy;
@BeforeAll
public static void globalSetup()
{
System.setProperty("webdriver.gecko.driver", "(path of the driver)");
}
@BeforeEach
public void setUp()
{
setUpProxy();
FirefoxOptions Options = new FirefoxOptions();
Options.setProxy(ClientUtil.createSeleniumProxy(proxy));
driver = new FirefoxDriver(Options);
}
@Test
public void testBasicAuth()
{
driver.get("https://webelement.click/stand/basic?lang=en");
Wait<WebDriver> waiter = new FluentWait(driver).withTimeout(Duration.ofSeconds(50)).ignoring(NoSuchElementException.class);
String greetings = waiter.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(Mention the xpath)"))).getText();
Assertions.assertEquals("(message");
}
@AfterEach
public void tearDown()
{
if(driver != null)
{
driver.quit();
}
if(proxy != null)
{
proxy.stop();
}
}
private void setUpProxy(
{
}
}
如果要将此方法传递给所有请求头请求,即特定代理,在这种情况下,应调用 forAllProxy 方法,如下所示:public void forAllProxy()
{
proxy = new BrowserMobProxyServer();
try {
String authHeader = "Basic " + Base64.getEncoder().encodeToString("webelement:click".getBytes("utf-8"));
proxy.addHeader("checkauth", authfirstHeader);
}
catch (UnsupportedEncodingException e)
{
System.err.println("the Authorization can not be passed");
e.printStackTrace();
}
proxy.start(0);
}
在上面的代码中,以 authHeader 开头的行表示我们正在创建请求头,这将被添加到请求中。之后,这些请求会通过我们在 proxy.addHeader(“checkauth”, authfirstHeader) 中创建的代理传递。try {
String authHeader = "Basic " + Base64.getEncoder().encodeToString("webelement:click".getBytes("utf-8"));
proxy.addHeader("checkauth", authfirstHeader);
}
catch (UnsupportedEncodingException e)
{
……………………
}
proxy.start(0);
}
最后,我们启动代理设置0来标记start参数,代理在端口上启动。使用 Firefox 扩展
下面分享如何使用适当的 Firefox 浏览器扩展来修改请求头请求。此选项的主要缺点是它仅适用于 Firefox(而不适用于 Chrome、Edge 等其他浏览器),现在很少用Firefox做测试了,简单学习一下。
执行以下步骤以使用 Firefox 扩展修改 HTTP 请求请求头:
- 下载 Firefox 浏览器扩展
- 加载扩展。
- 设置扩展首选项。
- 设置所需的功能。
- 准备测试自动化脚本。
让我们一步一步来:
下载火狐浏览器扩展
自行解决。
加载火狐扩展
参考以下代码添加 Firefox 配置文件:
FirefoxProfile profile = new FirefoxProfile();
File modifyHeaders = new File(System.getProperty("user.dir") + "/resources/modify_headers.xpi");
profile.setEnableNativeEvents(false);
try {
profile.addExtension(modifyHeaders);
}
catch (IOException e)
{
e.printStackTrace();
}
设置扩展首选项一旦我们将 Firefox 扩展加载到项目中,我们设置首选项(即在触发扩展之前需要设置的各种输入)。这是使用 profile.setPreference 方法完成的。
此方法通过键集参数机制设置任何给定配置文件的首选项。这里的第一个参数是设置值的键,第二个参数设置相应的整数值。
这是参考实现:
- profile.setPreference("modifyheaders.headers.count", 1);
- profile.setPreference("modifyheaders.headers.action0", "Add");
- profile.setPreference("modifyheaders.headers.name0", "Value");
- profile.setPreference("modifyheaders.headers.value0", "numeric value");
- profile.setPreference("modifyheaders.headers.enabled0", true);
- profile.setPreference("modifyheaders.config.active", true);
- profile.setPreference("modifyheaders.config.alwaysOn", true);
在上面的代码中,我们列出了我们想要设置 header 实例的次数。
profile.setPreference(“modifyheaders.headers.count”, 1);
接下来,我们指定操作,请求头名称和请求头值包含从 API 调用动态接收的值。
profile.setPreference(“modifyheaders.headers.action0”, “Add”);
对于实现的其余部分,我们启用 all 以便它允许在 WebDriver 实例化 Firefox 浏览器时加载扩展,并使用 HTTP 请求头将扩展设置为活动模式。
设置所需的功能Selenium 中的 Desired Capabilities 用于设置需要执行自动化测试的浏览器、浏览器版本和平台类型。
在这里,我们如何设置所需的功能:
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setBrowserName("firefox");
capabilities.setPlatform(org.openqa.selenium.Platform.ANY);
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
WebDriver driver = new FirefoxDriver(capabilities);
driver.get("url");完整自动化用例
完成上述所有步骤后,我们将继续设计整个测试自动化脚本:
public void startwebsite()
{
FirefoxProfile profile = new FirefoxProfile();
File modifyHeaders = new File(System.getProperty("user.dir") + "/resources/modify_headers.xpi");
profile.setEnableNativeEvents(false);
try
{
profile.addExtension(modifyHeaders);
}
catch (IOException e)
{
e.printStackTrace();
}
profile.setPreference("modifyheaders.headers.count", 1);
profile.setPreference("modifyheaders.headers.action0", "Add");
profile.setPreference("modifyheaders.headers.name0", "Value");
profile.setPreference("modifyheaders.headers.value0", "Numeric Value");
profile.setPreference("modifyheaders.headers.enabled0", true);
profile.setPreference("modifyheaders.config.active", true);
profile.setPreference("modifyheaders.config.alwaysOn", true);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setBrowserName("firefox");
capabilities.setPlatform(org.openqa.selenium.Platform.ANY);
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
WebDriver driver = new FirefoxDriver(capabilities);
driver.get("url");
}下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
gz 宫 中 好 程序媛木子 领取资料
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
更多相关内容 -
http请求头相关解释
2022-03-16 17:57:02如下,请求头如图: 对应解释: Accept: application/json, text/plain, */* 告诉服务器我可以接收的内容类型(Content-types) Accept-Encoding: gzip, deflate 接收的压缩格式。例如 Accept-Encoding: ...目录
1.请求头
如下,请求头如图:
对应解释:
Accept: application/json, text/plain, */* 告诉服务器我可以接收的内容类型(Content-types)
Accept-Encoding: gzip, deflate 接收的压缩格式。例如 Accept-Encoding: gzip, deflate;DEFLATE和GZIP理解为两种压缩算法
Accept-Language: en-US,en;q=0.9,zh;q=0.8,zh-CN;q=0.7 浏览器接收的语言,其实也就是用户在什么语言地区,例如简体中文的就是 Accept-Language: zh-CN
Authorization: Bearer ee85ed4e-d0e0-4465-bb81-31aaff1e33765 这个是我自己在代码中设置的请求头,这个字段存储用户的登陆认证信息,用于服务端校验Connection: keep-alive
告诉服务器这个user agent(通常就是浏览器)想要使用怎样的连接方式。值有keep-alive和close。http1.1默认是keep-alive。
keep-alive就是浏览器和服务器的通信连接会被持续保存,不会马上关闭,而close就会在response后马上关闭。
但这里要注意一点,我们说HTTP是无状态的,跟这个是否keep-alive没有关系,不要认为keep-alive是对HTTP无状态的特性的改进。Host:被请求服务器的域名或IP地址,如果不是通用端口,还包含该端口号。
例如:Host: www.some.com:182
设置服务器域名和TCP端口号,如果使用的是服务请求标准端口号,端口号可以省略
Host: en.wikipedia.org:8080
Host: en.wikipedia.org
Referer: http://appm.com:12080/
Referer 首部包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。
组成:协议+域名+端口号+路径+参数(注意,不包含 hash值)
例子:http://test.com:1998/home
在以下几种情况下,Referer 不会被发送:
来源页面采用的协议为表示本地文件的 “file” 或者 “data” URI;
当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS);
直接输入网址或通过浏览器书签访问;
使用 JavaScript 的 Location.href 或者是 Location.replace();
使用 html5 中 noreferrer
用途:
服务端一般使用 Referer 首部识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等,还有个常见的用途是图片防盗链。防盗链原理是:当用户访问网页时,referer就是前一个网页的URL;如果是图片的话,通常指的就是图片所在的网页。当浏览器向服务器发送请求时,referer就自动携带在HTTP请求头了。
图片服务器根据这个请求头判断,如果 referer 不是自己的服务器,就将其拦截。比如说掘金的图片:
https://user-gold-cdn.xitu.io/2019/9/23/16d5d0e6314aac90?imageView2/0/w/1280/h/960/format/webp/ignore-error/1
直接在浏览器中打开是可以访问的,因为此时 referer 不会被发送。
而如果把图片放到自己的网站下,是看不到正常图片的。
掘金、微信等客户端能看到,因为在掘金白名单里。
那么如何破解盗链呢,常用的是用一个服务器程序作为代理爬虫,服务器爬虫可以自由地设置请求头。
但是 referrer 存在很多问题。比如说在请求外部网站的时候,携带着 url 的很多参数信息,而这些信息实际上是隐私的,所以存在一定的隐私暴露风险。
下面的 origin 就不存在这种隐私问题。
Origin: http://appmanagement.cdt.test.cq.ctc.com:12080
请求首部字段 Origin 指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。除了不包含路径信息,该字段与 Referer 首部字段相似。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
用户的客户端信息,如上代表系统是Windows 10 浏览器是Chrome(谷歌)2. network网络请求参数
xhr:全称为XMLHttpRequest,用于与服务器交互数据,是ajax功能实现所依赖的对象,jquery中的ajax就是对
xhr的封装。如下图,如果经过压缩后的数据,会有两个size:
参考链接:
-
HTTP请求头:cookie cache
2020-12-23 16:49:04我们已了解过简单的http过程,下面就来详细了解http请求头中极为重要的两个东西参考上节代码,在谷歌浏览器上我们按下F12键,点击network,随便打开一个网站(比如百度)点击其网址,并view source来看一体请求头中的...我们已了解过简单的http过程,下面就来详细了解http请求头中极为重要的两个东西
参考上节代码,在谷歌浏览器上我们按下F12键,点击network,随便打开一个网站(比如百度)点击其网址,
并view source来看一体请求头中的内容。
cache-control 缓存 是可以让页面加载速度变快的机制,
列:服务器可以通过在回复头中设置 response.setHeader(‘Cache-Control’, ‘max-age=30’) 数字是以秒为单位
带有这些内容的页面,这句话的意思就是这个页面在接下来30秒的时间里如果有重复请求的操作时,不在请求而是直接从缓存里读取这个页面文件
通常某个网站会设置较长的时间,以提高页面在重复请求时的加载时间,但是这样做的话页面更新改版的话,用户怎么访问的到,总不可能等10年吧! 只要请求的URL有变化,那么就会重新请求,比如在原URL后跟一些查询参数。
缺点(占内存,当你访问的网站过多,缓存也就过多,占用的内存就过多;缓存不能再主页面设置)
Cookie 是什么Cookie 是浏览器访问服务器A后,服务器传给浏览器的一段数据。
浏览器需要保存这段数据,不得轻易删除。
此后每次浏览器访问该服务器A,都必须带上这段数据。
列:服务器在响应用户登录成功的时候,会设置cookie将加密的用户名和密码存入里边
Set-Cookie: =
-
HTTP请求头referer
2020-09-09 16:55:18通过谷歌和火狐浏览器自带的调试工具,可以看到HTTP请求头信息 从上图可以发现,Chrome浏览器中的请求头中的Referer地址为详细的页面地址信息,而Firefox浏览器中的请求头中的Referer地址,却只显示了域名信息。...本人微信公众号:前端修炼之路,欢迎关注。
前言
前几日用
form
表单提交一个留言,发现一个奇怪的问题。留言板有个来源的字段,用来获取网页的地址。测试时发现在谷歌Chrome浏览器中,可以正确获取到网址来源,然后用火狐Firefox浏览器,却无法正确获取到网址来源。因为后台使用的是PHP,留言成功之后通过JS弹出
alert
提示框,然后再通过location.href
跳转回留言页面。所以后台就需要准确的获取到留言页面的地址,但是后台并没有正确的获取到留言页面地址。这是为啥呢❓❓❓
Chrome浏览器和Firefox浏览器对比
看了后台获取来源的代码之后,了解到是通过
$_SERVER["HTTP_REFERER"]
这个PHP变量获取的。然后就去翻PHP文档,找到了HTTP_REFERER
变量的文档说明:引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改
HTTP_REFERER
的功能。简言之,该值并不可信。去百度百科里面,又看到如下内容:
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
从上面的论述中我们可以得到如下几点结论:
http_referer
由浏览器生成,并不是所有浏览器都会设置该值。http_referer
可以伪造,并不可信。
通过谷歌和火狐浏览器自带的调试工具,可以看到
HTTP
请求头信息从上图可以发现,Chrome浏览器中的请求头中的Referer地址为详细的页面地址信息,而Firefox浏览器中的请求头中的Referer地址,却只显示了域名信息。
难道是Firefox浏览器设置的问题吗? 所以我又去Stackoverflow查找了一番。
从上图可以得出两个结论:
HTTP_REFERER
这个变量真是不可信- Firefox浏览器允许用户修改这个字段
那在Firefox浏览器中怎么修改这个字段呢?
在火狐浏览器中输入
about:config
,然后搜索network.http.send
,找到network.http.senRefererHeader
,将这个字段值修改为0,就会禁止浏览器发送refer
信息。HTTP_REFERER的用途
HTTP_REFERER
提供了引导用户代理到当前页的前一页的地址信息。常见的一些应用场景有:
- 统计文章来源。例如有多少次是来自谷歌搜索结果,多少次来自百度搜索结果等。
- 图片防盗链。不是自己站点上的访问,图片显示404等。
如果你经常写博客,就一定会遇到盗用你辛辛苦苦整理过的文章不跟你打任何招呼甚至连原文链接都一并抹除的网站,文字这个层面我们没法控制,但是图片这个层面我们是可以控制的。
举个例子,如果你也曾复制过一些类似腾讯等网站的文章,你会发现黏贴下来发表之后经常出现图片无法显示,这是如何做到的呢?
场景:a站点的图片全部存储在c站点(云服务器)上,c站点将识别调用方是否来自a站点,否则显示一张错误图片,b站是盗图网站。a站和b站的代码一致,如下所示:
<img src="http://www.c.com/image.php?fname=jb.png" width="500px" height="500px" />;
重点是c站的代码,如下所示:
<?php if(strpos($_SERVER['HTTP_REFERER'], 'www.a.com') !== false){ //以下的写法并不严谨,这里只是做测试 if(file_exists($_GET['fname'])){ echo file_get_contents($_GET['fname']); } }
这样当a站访问时图片可以正常显示,而b站访问时图片是显示不出来的。
PHP $_SERVER[‘HTTP_REFERER’] 无效
通常下面的一些方式,
$_SERVER['HTTP_REFERER']
会无效:- 直接输入网址访问该网页。
- Javascript 打开的网址。
- Javascript 重定向(window.location)网址。
- 使用 meta refresh 重定向的网址。
- 使用 PHP header 重定向的网址。
- flash 中的链接。
- 浏览器未加设置或被用户修改。
所以一般来说,只有通过
<a></a>
超链接以及POST
或GET
表单访问的页面,$_SERVER['HTTP_REFERER']
才有效。结论
遇到的这个问题,本来以为是前端造成,代码哪里有问题,没有给后端发送正确的来源。通过百度和查找PHP手册发现,这个问题只能通过后端PHP修改。
而
HTTP_REFERER
这个变量其实也是HTTP
协议中相关知识。然后又因为不同的浏览器客户端对请求头处理规则不一样,所以造成了这个问题。也因为这个问题,补充了一个知识点,就是图片防盗链的基本原理。所以遇到一个问题后,通过学习可以补充不少相关联的知识点。✌️
本文参考、翻译了以下文章,并进行了整理。
参考链接:
References
[^1] PHP $_SERVER 手册:https://www.php.net/manual/zh/reserved.variables.server.php
[^2] HTTP_REFERER的用法及伪造:https://blog.csdn.net/u011250882/article/details/49679535
[^3] How reliable is HTTP_REFERER?:https://stackoverflow.com/questions/6023941/how-reliable-is-http-referer -
你知道http请求头有哪些吗?
2020-11-05 20:47:41文章目录http请求头是怎样组成的?HTTP Request Header 请求头HTTP Responses Header 响应头 http请求头是怎样组成的? HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头... -
HTTP 请求头各参数具体含义
2020-06-09 10:22:19HTTP 请求头各参数具体含义 HTTP的头域包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。 通用头部:是客户端和服务器都可以使用的头部,可以在客户端、服务器和其他... -
解密http请求头的Host,Referer,Origin背后的含义:
2021-12-23 16:52:01http请求头的Host,Referer,Origin -
html设置请求头host,Http请求头Host字段作用
2021-06-23 01:34:50HTTP/1.0不支持Host请求头;而在HTTP/1.1中,Host请求头部必须存在,否则会返回400 Bad RequestHost的作用是实现多个虚拟主机假如在192.168.9.10机器上部署三个站点:www.baidu.com,www.taobao.com和www.jd.com用... -
HTTP请求头和响应头注解
2022-04-02 13:45:18HTTP请求头和响应头 -
http请求头和响应头设置
2021-06-22 19:40:13windows中文操作系统默认gbk编码nodejs服务器默认返回utf-8content-type类型:text/palin; 普通文本类型text/html; html文档类型 比如res.end...文件的读写就是流操作text/xml ; xml 格式image/jpeg ; jpg图片格式ima... -
JavaWeb - 常用的HTTP请求头与响应头
2018-06-25 10:32:52客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码... -
HTTP请求头大小写问题踩坑记录
2022-04-04 00:07:33http协议header字段名大小写不敏感,所以在判断header是否相等时需要自己做忽略大小写得逻辑。 -
获取不到http请求头自定义参数
2022-01-26 19:07:27对外提供的API,需在http请求头传app_id(下划线分割),服务端通过request.getHeader("app_id")获取不到对应的参数值,排查原因,是因为nginx默认将带下划线的header自定义参数中的下划线去掉了(有的说过滤掉了,... -
HTTP请求头及其作用
2018-03-23 14:09:27HTTP请求头Header及其作用详解下面是访问的一个URL,http://www.hzau.edu.cn的一个header,根据实例分析各部分的功能和作用。1、Accept,浏览器端能够处理的内容类型。例如: Accept: text/html 代表浏览器可以... -
面试: http请求头和响应头都包含什么?
2020-09-04 11:55:511. http请求,请求头和响应头都有什么信息? 页面和服务器交互最常见的方式就是ajax,ajax简单来说是浏览器发送请求到服务端,然后服务端返回数据,常见的请求头和响应头如下图所示。 先看通用信息,通用信息有三... -
Http 请求头Cookie,响应头Set-Cookie
2021-01-25 20:23:52Http请求头 由服务器使用set-Cookie头发送,或者在Javascript中使用document.cookie设置 语法 Cookie: name=value; name2=value2; name3=value3 Set-Cookie Http响应头 用于从服务器向用户代理发送cookie,然后... -
常用的HTTP请求头与响应头
2018-02-07 17:04:47常用的HTTP请求头与响应头 HTTP消息头是指,在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件。HTTP消息头用来准确描述正在获取的资源、服务器或者客户端的... -
http请求头中的origin、referer、host
2021-08-20 16:05:05发送一个请求时,Request Headers(请求头)中会包含很多字段,我们来看一下请求头中的origin、referer、host的含义和区别。 我们先看一下请求头中包含这几个字段的情形。 1、Host 表示当前请求要被发送的目的地,... -
http请求头部各个字段的含义
2020-05-18 09:43:42HTTP头字段(英语:HTTP header fields)是指在超文本传输协议(HTTP)的请求和响应消息中的消息头部分。它们定义了一个超文本传输协议事务中的操作参数。HTTP头部字段可以自己根据需要定义,因此可能在 Web 服务器... -
HTTP请求头格式和响应格式
2019-04-22 21:38:00HTTP请求头格式 提示: 回车符 \r 换行符 \n 请求首行分析: 请求方式: GET 和 POST 方式: GET请求:地址栏访问、超链接访问都是get请求方式,get请求方式不安全,地址栏大小有限。 POST请求:内容在请求体中,... -
http请求头类型详解
2019-09-06 00:01:55是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在。 常见类型 application/x-www-form-urlencoded 1)浏览器的原生form表单 2) 提交的数据按照 ... -
http请求头有哪些字段
2019-03-28 10:23:25请求头字段的具体含义 Accept:浏览器可接受的MIME类型。 Accept-Charset:浏览器可接受的字符集。 Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。 Accept-Language:浏览器所希望的语言种类,当... -
http请求头详解and爬虫
2017-10-24 20:40:47爬虫离不开http协议,在模拟请求的时候,请求头伪装的越像越好。我自己在这里总结一下请求头里所有(如果有落下请留言提醒我)参数详情,更多的侧重爬虫。请求头大小写识别,首字母大写。文中client,客户端,浏览器... -
HTTP请求头Authorization
2018-12-30 14:17:50今天部署了一个Authorization项目,由于改了auth服务器客户端id和密码,而前端请求header没有修改,登录时一直弹框...POST /goform/ser2netconfigAT HTTP/1.1 Host: 192.168.16.254 Connection: keep-alive Author... -
HTTP请求头部Content-Type字段
2018-03-09 11:40:40GET 请求不存在请求实体部分,键值对参数放置在 URL 尾部,因此请求头不需要设置 Content-Type 字段 非 ASCII 码会自动进行编码转换,例如发送请求:www.bilibili.com?hehe=你的我的 GET /?hehe=%E4%BD%A0%E7%9A%.... -
HTTP请求头参数设置
2018-12-28 19:03:14HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new; Content-Length 请求的内容长度 Content-Length: 348 Content-Type 请求... -
http 请求头设置
2017-09-11 16:59:52三部分组成: 状态行、请求头、消息主体头信息 [method]:GET/POST Content-Type : 提交的数据编码方式 (详情见后) If-Modified-Since:告诉浏览器是否需要返回新的资源,不返回,使用本地,响应 304 Not ... -
http请求头中的content-type属性
2020-05-10 00:04:30在HTTP请求中,我们每天都在使用Content-Type来指定不同格式的请求信息,但是却很少有人去全面了解Content-Type中允许的值有多少,因此这里来了解一下Content-Type的可用值,以及在Spring MVC中如何使用它们来映射... -
HTTP请求头中的referer字段
2020-05-27 12:58:10文章目录1.... 实例3. referer字段的作用?1. 统计网站请求来源2. 防盗链4....简单来说就是当你向一个服务器发起请求的时候,服务器会很好奇,你是从哪里知道它的,因此你需要通过http请求头中的referer字段告