6

我注意到一些网站(包括旧的http://careers.stackoverflow.com 1.0)的查询字符串如下所示:

http://somewebapp.example/?123

相比于:

http://somewebapp.example/123或者http://somewebapp.example/id/123

开发人员选择使用第一个示例而不是第二个和第三个示例来实现其 Web 应用程序的 URL 的原因是什么?

作为奖励,如果这123是数据库表中某行的主键,如何在 PHP 中实现第一个示例?(我只需要知道如何123从 URL 中检索;我已经知道如何在数据库中查询 . 的主键123。)

编辑 [5/28]:哎呀,忘了让大家知道我知道后两个 URL 是什么,它们如何工作以及如何实现它们。不过感谢您的提醒,我想我有一些不相关的误解,无论如何都被偶然澄清了!

4

7 回答 7

9

第一个更容易实现;之后的一切?是查询字符串的一部分。Web 服务器加载 ? 之前指定的页面,并单独处理查询字符串(在 PHP 中可以通过 访问$_GET

在第二个示例中,开发人员需要设置 Web 服务器以将所有请求重定向到一个特殊页面(因为/123服务器上没有页面),然后它将解析 URL 以确定请求的内容

至于您的最后一个问题,123将显示$_GET为一个键,因此key($_GET)假设它是您在查询字符串中传递的唯一内容

于 2010-05-28T17:08:43.323 回答
1

您可以使用 php 从 php 访问它

$_SERVER['QUERY_STRING']
于 2010-05-28T17:10:54.463 回答
1

第一个 URL 使用查询参数来发送数据。后者是一种RESTURL 形式,它实际上指向一个资源ID 123

于 2010-05-28T17:11:03.757 回答
0

第一个例子是一个查询字符串;第二个和第三个例子不是。从每个开发人员都应该了解的 URL中了解有关 URL 的更多信息。要使用查询字符串中的 id,您需要使用适当的库对其进行解析。

于 2010-05-28T17:08:40.693 回答
0

开发人员选择使用第一个示例而不是第二个和第三个示例来实现其 Web 应用程序的 URL 的原因是什么?

美学。阅读有关酷 URI的信息,以获得有关如何设计 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']

于 2010-05-28T17:09:28.533 回答
0

这实际上与 modRewrite 规则或 apache 配置有关。一些框架,如 Code Ignitor 使用这些路由将您定向到在技术上实际上不存在于该物理位置的页面。它被解析并且框架确定哪个视图适合显示。一些规则允许 Web 服务器在 / 之后传递任何内容作为参数来确定框架中是否有可用的有效路由。有些系统不会自动执行此操作,因此会放置一个问号以强制将其作为路由传递给框架

如果您想从第一个实例中获取 123,则需要拉取请求 query_string

于 2010-05-28T17:10:20.940 回答
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参数来附加当前查询字符串(如果有),而不会弄乱任何东西。

于 2010-05-28T17:19:59.867 回答