谈一谈URL中位于最末尾的那条斜杠

本文探讨了URL末尾斜杠在Web开发中的作用,通过实验演示了斜杠如何影响资源加载路径,强调了在指向目录时加上斜杠及使用绝对路径的重要性。

问题在浏览网页的时候,如果你留意每一个页面的url,就会发现有的末尾带斜杠,而有的没带。在web开发中我们往往也很少去留意url末尾上的那条斜杠,但有的时候没有这条斜杠就会导致一些意想不到的结果。

作为演示,我们先用node创建一个本地http服务器httpServer.js。代码如下:

const http = require('http');
const fs = require('fs');

http.createServer(function (request, response) {
  fs.readFile('./index.html', function (e, d) {
    response.writeHead(200);
 response.end(d);
 });
}).listen(8081);

这个服务器的行为很简单,读取当前目录下的index.html文件并返回给前台。现在我们新建index.html:

<!doctype html>
<html lang="en">
<head>
    <title>test</title>
    <link rel="stylesheet" href="style.css">
    <script src="index.js"></script>
</head>
<body>
	boot done
</body>
</html>

我们用node启动http服务器:

node ./httpServer.js

这时候打开浏览器,访问localhost:8081,就可以看到index中的内容了。现在打开浏览器控制台,查看Network一项,style.css的请求路径为http://localhost:8081/style.css,index.js的请求路径为http://localhost:8081/index.js ,一切都很正常。

现在我们访问http://localhost:8081/doc这个路径,再来看浏览器控制台,style.css和index.js的路径都没有变化。路径已经改成/doc,但是代码中的相对路径的根目录却没有发生改变。

再来访问http://localhost:8081/doc/,打开控制台,就会发现style.css和index.js的请求路径变成了http://localhost:8081/doc/style.css和http://localhost:8081/doc/index.js。

这种现象的原理也很简单:访问http://localhost:8081/doc,是告诉浏览器去请求根目录下的名为doc的文件,浏览器所在路径还是根目录,所以代码中的相对路径并没有改为doc,如果访问http://localhost:8081/doc/,则是告诉浏览器去请求根目录下doc目录中的默认文件。这时浏览器解析代码中的相对路径时根目录也相应的改为了doc目录。

有的http服务器在url末尾没有加斜线,又没有找到对应的文件,但是找到相应的目录的时候,会在原url上加上斜线,并发送一个301重定向给前台,让浏览器跳转到相应地址。但如果web服务器不这么做,或者是直接读取目录下的默认文件给前台,那么后果将是直接404,或者响应数据中所有相对路径的根目录都发生改变,导致资源404。即使http服务器为错误的url响应了重定向,也是无故的多了一次请求,浪费了性能。

除了注意在指向目录时加上斜线以外,在指向静态资源时也尽量使用绝对路径以确保万无一失。

### 查找字符串中最后一个斜杠的索引位置 在字符串中查找最后一个斜杠 `/` 的索引位置,可以使用 `lastIndexOf()` 方法。该方法会返回指定字符或子字符串在字符串中最后一次出现的索引位置,如果没有找到,则返回 `-1` [^3]。 #### Java 示例代码 以下是一个 Java 实现的示例,用于获取字符串中最后一个斜杠的索引位置: ```java public class LastSlashIndex { public static void main(String[] args) { String path = "image://../../assets/img/health/helo/test.png"; int lastIndex = path.lastIndexOf("/"); if (lastIndex != -1) { System.out.println("最后一个斜杠的位置是:" + lastIndex); String fileName = path.substring(lastIndex + 1); System.out.println("文件名是:" + fileName); } else { System.out.println("未找到斜杠"); } } } ``` 此代码使用 `lastIndexOf("/")` 方法查找字符串中最后一个斜杠的位置,并通过 `substring()` 方法提取斜杠后的内容 [^5]。 #### Objective-C 示例代码 在 Objective-C 中,可以使用 `rangeOfString:options:` 方法结合 `NSBackwardsSearch` 选项来查找最后一个斜杠的位置: ```objective-c NSString *str = @"image://../../assets/img/health/helo/test.png"; NSRange range = [str rangeOfString:@"/" options:NSBackwardsSearch]; if (range.location != NSNotFound) { NSLog(@"%ld", range.location); NSString *fileName = [str substringFromIndex:range.location + 1]; NSLog(@"%@", fileName); } ``` 该方法通过 `NSBackwardsSearch` 选项从字符串末尾向前查找,确保获取的是最后一个斜杠的位置 [^5]。 #### JavaScript 示例代码 在 JavaScript 中,也可以使用 `lastIndexOf()` 方法实现相同的功能: ```javascript let url = "image://../../assets/img/health/helo/test.png"; let lastIndex = url.lastIndexOf("/"); if (lastIndex !== -1) { console.log("最后一个斜杠的位置是:" + lastIndex); let fileName = url.substring(lastIndex + 1); console.log("文件名是:" + fileName); } else { console.log("未找到斜杠"); } ``` 此代码使用 `lastIndexOf()` 方法查找最后一个斜杠,并通过 `substring()` 提取文件名 [^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值