在论坛中看到很多站长都十分关心 URL,也有一些站长对如何实现绝对地址不是很清楚,接下来将用浅显易懂的言语来解释这个问题,希望能对站长们有所帮助。

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

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

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

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

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

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

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

接下来我们修改一下这个文件内容

  1. <html>
  2. <head>
  3. <base href="http://www.discuz.net/">
  4. </head>
  5. <body>
  6. <a href="./" ><img src="static/image/common/logo.png" /></a>
  7. </body>
  8. </html>

然后再次访问 http://虚拟机地址/test/url.html(或者是 F:dzurl.html 也可以看到相同的效果) ,我们将能看到 discuz 的 logo,点一下也跳转到了官方论坛。
细心的你也许发现了, 在<head> 段多了一个标签 <base href="http://www.discuz.net/"> 正是这个标签,设定了相对地址的基准 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/ 对应官方的论坛就是这样的 http://www.discuz.net/ 这个值最终出现在了页面中的<base> 标签里。

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

我们还以官方论坛首页为例进行说明, 大体流程如下
[入口文件]->[初始化设置]->[模块文件]->[加载模板]->[执行模板]->[输出准备]->[正则替换]->[内容输出]
1. 访问 http://www.discuz.net/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 地址静态化。接下来就是页面输出,呈在了浏览器中。