找回密码
 立即注册
搜索
查看: 54|回复: 0

[discuz官方论坛] URL绝对地址与相对地址

[复制链接]

64

主题

0

回帖

2万

积分

超级版主

积分
20208

突出贡献优秀版主论坛元老

发表于 2024-12-5 21:02:59 | 显示全部楼层 |阅读模式
在论坛中看到很多站长都十分关心URL,也有一些站长对如何实现绝对地址不是很清楚,接下来将用浅显易懂的言语来解释这个问题,希望能对站长们有所帮助。

首先说一下这个探讨的原因,相信大多数站长关心的不只是技术本身,而是如何实现更好的运营。在网上有太多关于绝对地址与相对地址影响SEO的文章。观点主要是以下几方面:
1.使用绝对地址有利于SEO。
2使用相对地址方便站点的变更。

首先简单介绍一下绝对地址与相对地址,我们打开discuz的官方站点 https://discuz.dismall.com/ 然后查看源代码。去找到logo的这段话,是这样的

  1. <a href="./" title="Discuz! 官方站"><img src="static/image/common/logo.png" alt="Discuz! 官方站" border="0" /></a>
复制代码

这个a标签的URL地址就是相对地址, ./表示的是当前目录,也就是https://discuz.dismall.com/ ,同样我们看到了图片的地址static/image/common/logo.png 也是相对地址,真正的地址是
接下来搜索"设置",我们将找到这样的一个标签<a href="https://discuz.dismall.com/home.php?mod=spacecp">设置</a> 这里使用的就是绝对地址。

先深入介绍一下相对地址,我们发现相对地址只是写了后面的一部分,那前面的内容是怎么得到的呢。刚才我们在discuz的官网上访问的那个页面,所以前面的那一部分就是https://discuz.dismall.com/了,好,为了验证这个猜想,我们写一个简单的页面
文件名叫url.html,内容如下

  1. <a href="./" ><img src="static/image/common/logo.png" /></a>
复制代码

然后放在另一个站点下,这里我以自己的一台虚拟机为例,访问地址为http://虚拟机地址/test/url.html
然后我们发现,图片是无效的,链接点了以后是http://虚拟机地址/test/ 说明相对地址相对的是以当前的URL,换句话说相对地址的基准是当前的URL。
同样,我们把文件保存在自己的个人电脑里,如F:\dz\url.html ,然后用浏览器直接打开这个文件,将会看到地址栏为file://F:\dz\url.html,没有显示图片,点击之后进入了文件所在的目录file://F:\dz。

接下来我们修改一下这个文件内容
  1. <html>
  2. <head>
  3. <base href="https://discuz.dismall.com/">
  4. </head>
  5. <body>
  6. <a href="./" ><img src="static/image/common/logo.png" /></a>
  7. </body>
  8. </html>
复制代码

然后再次访问http://虚拟机地址/test/url.html(或者是F:\dz\url.html 也可以看到相同的效果) ,我们将能看到discuz的logo,点一下也跳转到了官方论坛。
细心的你也许发现了,在<head>段多了一个标签 <base href="https://discuz.dismall.com/"> 正是这个标签,设定了相对地址的基准URL,
关于相对地址的总结如下:如果页面中没有<base>标签来设定,将以当前URL为基准。如果设定了<base>将以此为准,用来拼接页面中的相对地址。

关于绝对地址,就容易很多,不需要拼接,直接访问。

discuz默认采用的是相对地址,并且设置了<base>标签。
下面重点讲一下<base>标签的设置过程。
我们打开template/default/common/header_common.htm这个模版文件,将会看到<base href="{$_G['siteurl']}" /> 那么$_G['siteurl']是在哪里设置的呢,我们打开文件source/class/class_core.php,查找siteurl,有一行是这么写的.
  1. $_G['siteurl'] = htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].$sitepath.'/');
复制代码

更详细的程序逻辑不在此细说,基本意思就是取得当前文件所在的路径。在本地的测试机上可能是这样的 http://localhost/x2/ 对应官方的论坛就是这样的 https://discuz.dismall.com/ 这个值最终出现在了页面中的<base>标签里。

为了说明如何实现绝对地址,还需要详细讲一下dz的页面是如何输出的

我们还以官方论坛首页为例进行说明,大体流程如下
[入口文件]->[初始化设置]->[模块文件]->[加载模板]->[执行模板]->[输出准备]->[正则替换]->[内容输出]
1.访问https://discuz.dismall.com/forum.php 加载入口文件forum.php
2.在最后一行之前的所有代码,都是做初始化的工作
3.forum.php最后一行代码,加载了模块文件,这里的$mod值为 index
  1. require DISCUZ_ROOT.'./source/module/forum/forum_'.$mod.'.php';
复制代码

4.forum_index.php文件前面的部分都是模块文件的数据处理,取得版块信息。
5.forum_index.php最后一行执行代码 include template('diy:forum/discuz:'.$gid); 将通过discuz系统函数加载模版。
6.在function_core.php中的函数template()取得了所需的模板地址,为1_diy_forum_discuz.tpl.php,这里面是通过静态模板生成的php代码,将内容与模版结合在一起。
7.1_diy_forum_discuz.tpl.php的最后一条php语句为<?php output();?>正是这句话完成的输出准备与最终输出。
function_core.php中的函数output(),首先取得了页面内容。
8.通过函数output_replace()完成了正则替换.(我们要讲的重点也在这里)
9.最终,页面输出,大功告成。

output_replace()函数与cache_setting.php中$_G['setting']['output']的设置。
output_replace()函数的前半部分是应用域名替换,后面部分是静态化的实现。与之对应,cache_setting.php中设置$_G['setting']['output']的时候$output['str']是用来替换应用域名$output['preg']是用来实现静态化。

下面,我们进入后台->全局->域名设置->应用域名
在这里什么都不填的话,$output['str']是空的,在output_replace()中也不会进行应用域名的替换。
如果只填写了默认域名,那么相当于所有的应用都填的默认域名。$output['str']的值,经过output_replace()的替换,整个站点的链接都变成了绝对地址。因为替换规则就是将<a href="forum.php"换成了<a href="http://yourdomain/forum.php",默认的论坛入口就是这4个 portal.php forum.php group.php home.php,如此一来实现了绝对地址,
如果只填写某一项应用的域名而不填默认,程序会将其他几个应用设置为当前域名。

做好了上面的准备工作,假如我们填写了默认域名,output_replace()将会把所有的php入口文件前面加上我们设置好的域名,从而形成绝对URL地址,下面一步是把URL地址静态化。接下来就是页面输出,呈在了浏览器中。


原文链接:https://discuz.dismall.com/thread-2354457-1-1.html

手机版|Discuz! X

GMT+8, 2024-12-22 09:53 , Processed in 0.116709 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表