我什至不知道这个方法是怎么调用的,我只知道我想要实现的行为。
我的例子是 Facebook。如果你去facebook.com/[username or id]
你的个人资料页面,但我无法想象他们会在他们的根文件夹中创建一个目录并为每个用户放置一个索引文件。
那么以下行为是如何完成的;你去,somepage.com/foo/bar/hello
但实际上你在请求somepage.com/foo?bar=hello
?
这甚至可以用 Apache 和 PHP 实现吗?
我什至不知道这个方法是怎么调用的,我只知道我想要实现的行为。
那东西称为 URI/URL,它的本地部分被传递给网络服务器。然后网络服务器处理请求。
这甚至可以用 Apache 和 PHP 实现吗?
是的。甚至没有。这就是网络服务器的用途。服务器上发生的事情完全被 HTTP 协议屏蔽,该协议只知道 URI/URL 规范,不规范是否需要以及如何匹配网络服务器上的具体进程或文件。
例如,对于 Apache HTTP 服务器,有一个名为Mod_Rewrite的著名模块可以进行 URL 重写。通常情况下,使用她的浏览器的用户不会注意到它。
使用 PHP 文件 (Apache HTTPD) 的示例配置:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
在 PHP 脚本中,您可以通过使用 和 等特殊变量来获取 URI/ $_SERVER['REQUEST_URI']
URL$_SERVER['QUERY_STRING']
。
通常这是用mod rewrite制作的。在那里,您可以为脚本的变量创建“路径”。
例如http://example.com/user/1/edit可以用 mod rewrite 翻译成http://example.com/index.php?function=edit&userid=1
这样的规则如下所示:
RewriteEngine on
RewriteRule ^/user/([0-9]+)/([a-z]+)$ index.php=function=$2&userid=$1 [L]
第一行激活了重写模块,第二行有一个正则表达式,它必须匹配内部重写 url 。如果你喜欢,你也可以在外部使用[R]
.[L]
查看整个文档以了解更多信息。
括号中的东西是所谓的标志,也有很好的文档记录。
我希望这会有所帮助!