我注意到有些网站(包括旧版http://careers.stackoverflow.com 1.0)的查询字符串如下所示:
http://somewebapp.example/?123
与:相比:
http://somewebapp.example/123
或http://somewebapp.example/id/123
开发人员选择使用第一个示例而不是第二个和第三个示例来选择实现其网络应用的网址的原因是什么?
作为奖励,如果123
是数据库表中某些行的主键,那么如何在PHP中实现第一个示例? (我只需要知道如何从URL中检索123
;我已经知道如何在数据库中查询123
的主键。)
编辑[5/28]:哎呀,忘了让每个人都知道我知道后两个网址是什么,它们如何工作以及如何实现它们。感谢提醒,但我认为我有一些无关紧要的错误观念,无论如何都是偶然澄清的!
答案 0 :(得分:9)
第一种更容易实施;之后的一切?是查询字符串的一部分。 Web服务器加载在?之前指定的页面,并单独处理查询字符串(在PHP中可以通过$_GET
访问)
在第二个示例中,开发人员需要设置Web服务器以将所有请求重定向到特殊页面(因为服务器上没有/123
页面),然后将解析URL以确定被要求
关于您的上一个问题,123
会在$_GET
中显示为关键字,因此key($_GET)
会假设它是您在查询字符串中传递的唯一内容< / p>
答案 1 :(得分:1)
您可以使用
从php访问它$_SERVER['QUERY_STRING']
答案 2 :(得分:1)
第一个URL使用查询参数来发送数据。后者是REST
URL的一种形式,实际上指向具有ID 123
答案 3 :(得分:0)
第一个例子是查询字符串;第二个和第三个例子不是。详细了解What Every Developer Should Know About URLs中的网址。要使用查询字符串中的id,您需要使用适当的库对其进行解析。
答案 4 :(得分:0)
开发人员选择使用第一个示例而不是第二个和第三个示例来选择实现其网络应用的网址的原因是什么?
美学。阅读cool URIs以获得有关如何设计URI的一些好建议。
如何实现PHP中的第一个示例
你正在寻找$_SERVER['PATH_INFO']
,但要注意:一些托管服务提供商在那里放了虚假的东西。
在这些情况下,您需要使用mod_rewrite或类似的..
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(\d+) /index.php?id=$1 [L,QSA]
这样,您就可以从$_GET['id']
答案 5 :(得分:0)
这实际上与modRewrite规则或apache配置有关。像Code Ignitor这样的一些框架使用这些路由将您引导到一个在该物理位置实际上不存在的页面。它被解析,框架确定哪个视图适合显示。某些规则允许Web服务器在/作为参数之后传递任何内容,以确定框架中是否有可用的有效路由。有些系统不会自动执行此操作,因此会放置一个问号以强制它作为路径传递给框架
如果您想从第一个实例获取123,则需要提取请求query_string
答案 6 :(得分:0)
如果您正在使用Apache(并且您可以在其他服务器上执行相同的操作,但我不知道详细信息),那么这些内容将会有一个有趣的技巧:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1
</IfModule>
规则:如果请求的页面不是文件!-f
或目录!-d
,则加载page not found
并传递请求的路径,而不是发出index.php
错误以$_SERVER['PATH_INFO']
的形式添加到该脚本中(也可以从$_SERVER['REQUEST_URI']
中提取。
或者您可以告诉Apache重写为index.php?$1
,在这种情况下,路径可以从$_SERVER['QUERY_STRING']
中提取。 (在这种情况下,您应该使用QSA
参数附加当前查询字符串(如果有),而不会弄乱任何内容。