什么';s文件/路径的URL背后的机制;不存在却被展示


What's the mecanism behind a URL of a file/path that doesn't exist and yet get displayed?

我有一个用PHP为我开发的网站,我正在努力了解它的一些功能是如何工作的。例如,我有以下URL。

http://www.hilariousworld.com/On2wheelz/index.php/admin/adddeals/adminhtml_adddeals

服务器上有一个名为index.php的文件,但没有这样调用的文件夹,但URL仍然是/admin/adddeals/adminhtml_addeals,我似乎找不到。我的猜测是这是某种"php魔术",但我不知道是什么。

有人能向我解释一下,或者给我一个提示,或者指引我查看一些文档,或者告诉我应该在谷歌上搜索什么来弄清楚这是怎么回事吗?

URL的处理方式取决于您使用的实际框架。一个简单的方法是通过.htaccess,例如

1  RewriteEngine on
2  RewriteCond %{REQUEST_FILENAME} !-f
3  RewriteCond %{REQUEST_FILENAME} !-d
4  RewriteRule ^(.*)$ index.php?first_param=$1&second_param=$2 [L]

这就是上面代码的含义:

  1. 打开重写引擎
  2. 如果URL中请求的文件不存在,则遵循重写规则
  3. 如果URL中请求的目录不存在,则遵循重写规则
  4. 重写规则:在基本URL被用作GET变量之后,用户看不到的任何内容,例如www.example.com/link/4,都将被解释为www.example.com?first_param=link&second_param=4

现在这是做这种事情最简单的方法,像WordPress和Drupal这样的CMS有自己的处理URL的方法。

您可以在此处查看有关.htaccess URL重写的更多信息:http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

您可以将/anythingYouLike粘贴在URL中的filename.php之后。PHP以本机方式处理它。

完整的URL可通过$_SERVER获得。

如果你看到一些MVC框架,你会在一个特殊的文件.htaccess中看到一些类似的代码。

RewriteEngine on    
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L] 

此规则定义Url重写机制。因此,您的示例url被视为:

Actual Url :  http://www.hilariousworld.com/On2wheelz/index.php
Query String :   /admin/adddeals/adminhtml_adddeals

由于.htaccess已经将所有请求重定向到index.php及其查询字符串部分。现在,框架处理查询字符串部分,以确定实际的控制器/动作组合(在非mvc应用程序请求内容动作的情况下(需要提供什么。