作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
当我们访问node/1这个路径的时候,会发生什么呢?首先我们看到的路径,通常是这样的形式:
此时,我们是启用了简洁URL的,如果没有启用的话,可以配置,网上有比较多的教程。不启用简洁URL的路径,则是这样的:
http://www.example.com/?q=node/1
是的,与前者相比,多了一个“?q=”。
这是我们看到的路径,也是Apache看到的路径。可能有人会问,难道Drupal看到的路径不是这个样子的?是的,Drupal看到的路径不是这个样子。那么可能还会有人继续问,Drupal看到的路径是什么?Drupal看到的路径是这个样子的:
http://www.example.com/index.php?q=node/1
别名模式下:
http://www.example.com/index.php?q=aboutus
我们在本地做一个实验,分别访问路径:
http://localhost/snt6/index.php?q=node/1
http://localhost/snt6/?q=node/1
我们看到了什么?我们看到的内容是完全一样的。aboutus和node/1之间是别名关系,可以说是一一对应的关系,Drupal在数据库里面,有张表,用来存储这样的对应关系。当我们访问路径aboutus的时候,它自动的就找到了对应的内部路径node/1。这个我们比较好理解。对于很多人,他刚开始的时候,并不知道Drupal看到的路径是:
http://www.example.com/index.php?q=node/1
很多人可能有个误区,感觉我们看到的路径,就是Drupal看到的路径。这样理解是有问题的。
当我们使用
http://www.example.com/?q=node/1
访问页面时,Apache帮我们做了转换,它将这个路径转为了:
http://www.example.com/index.php?q=node/1
在简洁URL下,apache将路径http://www.example.com/node/1最终也会转为:
http://www.example.com/index.php?q=node/1
有人可能会问,你是怎么知道这个转换的?在Drupal的根目录下,有这样一个文件.htaccess。我们打开这个文件,里面有这行代码:
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
这段代码就是做这个转换的,这段代码里面的RewriteCond %{REQUEST_FILENAME} !-f是什么意思?这个我也不知道。我们只需要知道,这里做了一个路径转换。仅此而已。