我甚至不知道如何调用此方法,我只知道我想要实现的行为。
我的例子是Facebook。如果你转到facebook.com/[username or id]
,你会进入个人资料页面,但我无法想象他们是在他们的根文件夹中创建一个目录并为每个用户放置一个索引文件。
那么如何完成以下行为;您转到 somepage.com/foo/bar/hello
,但实际上您要求 somepage.com/foo?bar=hello
?
这对Apache和PHP来说是否可行?
答案 0 :(得分:2)
我甚至不知道如何调用此方法,我只知道我想要实现的行为。
这个东西叫做URI / URL,它的本地部分被传递给网络服务器。然后,Web服务器处理请求。
这对Apache和PHP来说是否可行?
是。甚至没有。这就是网络服务器的用途。服务器上发生的事情完全由HTTP协议屏蔽,该协议只知道URI / URL规范,该规范不管理是否以及如何匹配Web服务器上的具体进程或文件。
例如,对于Apache HTTP Server,有一个名为Mod_Rewrite的着名模块可以进行URL重写。通常用浏览器的用户不会注意到它。
使用PHP文件(Apache HTTPD)配置示例:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
在PHP脚本中,您可以通过使用$_SERVER['REQUEST_URI']
and $_SERVER['QUERY_STRING']
等特殊变量来获取URI / URL。
答案 1 :(得分:1)
通常这是mod rewrite。在那里,你可以创建一个脚本变量的“路径”。
E.g。 http://example.com/user/1/edit可以通过mod重写转换为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]
的{{1}}修饰符实例外部。
了解整个documentation以了解详情。
breckets中的东西是所谓的标志,也是well documentated。
我希望有所帮助!