我有一个用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]
这就是上面代码的含义:
- 打开重写引擎
- 如果URL中请求的文件不存在,则遵循重写规则
- 如果URL中请求的目录不存在,则遵循重写规则
- 重写规则:在基本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应用程序请求内容动作的情况下(需要提供什么。