我有时在网站网址中看到的不寻常的东西是什么



对不起,我真的不知道如何拼写标题,但这已经困扰了我很多年了。我一直在想,有时在网站上你会看到一个奇怪的url结构。以youtube为例:

youtube.com/c/this_persons_channel

我只是不明白它是怎么工作的!我知道/意味着它是网站中的一个文件夹,但它是如何结束的。它是一个文件吗?如果是,文件类型在哪里?这个文件是由代码组成的吗?因为它是针对特定用户的。当他们创建网站的时候,它不可能在那里。

如果这是一个愚蠢的问题,我很抱歉,但我不知道该搜索什么来了解更多信息。

我认为您所说的是重写url。这可以在项目的.htaccess文件中完成。

url的末尾不是文件或文件夹。它是一个查询字符串。其可以通过代码访问并用于定制页面。获取这个问题的url:

https://stackoverflow.com/questions/69684211/what-is-the-unusual-thing-that-i-sometimes-see-in-website-urls

也可以表示为:

https://stackoverflow.com/questions?id=69684211&name=what-is-the-unusual-thing-that-i-sometimes-see-in-website-urls

注意:这些可能不是查询字符串的实际名称,只是一个示例。

通过书写:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^index/([0-9]+) index.html?id=$1 [NC,L]

.htaccess文件中,您可以将url

http://localhost/index.php?id=5

进入

http://localhost/index/5

注意:刷新页面时,这不会简单地更改url。但如果我输入http://localhost/index/5"它会给我和我输入的页面一样的页面"http://localhost/index.php?id=5"。因此,您必须将该页面的所有重定向更改为首选url。所有这些代码所做的就是制作它,这样它就不会把你发送到404错误页面。如果你愿意,你可以写一些php代码,如果你在原始url上,它会自动重定向你。

网站这样做有几个原因:

  • 使url更容易记忆和编写
  • 使搜索引擎更容易找到网站

解释.htaccess代码
一旦您理解了代码的含义,实际上就相当简单了
第1行:

RewriteEngine on

通过将其设置为打开,它允许您重写并制定自己的url规则。什么是重写引擎

第2行:

RewriteCond %{REQUEST_FILENAME} !-d

这一行是一个条件,有点像if语句,它说如果请求的文件名不是目录,那么继续代码。这是为了防止文件与文件夹的名称相同,并且可能在url中混淆的问题。

第3行:

RewriteCond %{REQUEST_FILENAME}.php -f

此行检查请求的文件是否具有扩展名"php"——它不一定是php,它可以是您想要的任何文件
有关.htaccess规则和条件的详细信息:.htaccess重写规则

第4行:

RewriteRule ^index/([0-9a-zA-Z_-]+) index.php?id=$1 [NC,L]

好的,这是最令人困惑的一行。它基本上是描述将url更改为的规则。

开头的"^"表示忽略url中在其后面的内容之前的任何内容。因此,它将忽略url中"index"之前的内容。

现在,您需要设置index/和url中下一个"/"之间允许使用哪些字符的规则。如果url中只有一个查询,那么不用担心在末尾添加另一个"/"。但是,如果您有?name参数,则url将为https://localhost/index/5/charlie。但是因为我有两个搜索参数,所以我必须添加另一个正则表达式。所以最后一行现在将变成RewriteRule ^index/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+) index.php?id=$1 [NC,L]

在本例中,它允许0-9、a-z(小写和大写)、下划线和连字符之间的所有字符。因此,只有当url包含这些字符时,它才会重写url。例如,如果它包含一个美元符号$,那么它就不会重写。

请确保在结束方括号后包含+!如果末尾没有+,它将只允许1个字符的值。所以?id=5会起作用,但?id=52不会起作用。但有了+,一切都会好起来的。

现在,这行的下一部分告诉服务器你想在url中重定向到什么。在这种情况下,您希望重定向到index.php,因此您编写了该命令。

您还希望包含这些参数,以便在代码中实际使用它们。所以现在添加查询字符串/s。但是我们不知道?id参数是什么。所以我们需要在那里放一个占位符。现在输入?id=$1。确保变量被调用为1,而不是其他变量。

如果要有多个参数,只需先写&param2=$2,然后写&param3=$3,依此类推

最后需要添加的是[NC,L]NC的意思是Non Case,这意味着如果有人用大写的I写index.php,那就无关紧要了。其中L意味着先前的重写条件仅适用于该规则,而不适用于以后可能有的任何规则。

如果你不理解我的解释,请看Dani Krossing的视频,他解释得很好:https://www.youtube.com/watch?v=zJxCq6D14eM