GET变量和美化URLs

3
我觉得这可能是一个初学者问题,但还是问一下吧。
我正在尝试更好地理解 PHP 中的 $_GET 变量。很多 CMS 等将像 site.com/?ID=42 这样的东西转换成类似 site.com/42 的形式。
我的问题是,当这种情况发生时,$_GET 变量会发生什么?我尝试在页面加载时打印 GET 数组,但它为空。
4个回答

3
他们使用 mod_rewrite来实现这一点。
基本上,您可以让Web服务器将URI请求“重写”为其他内容,因此您有类似于以下的传入请求。
http://your.site.com/Page/arg1/arg2/arg3

但是通过您的REWRITE RULE,您可以让Apache将匹配该模式(所有请求都绑定到/Page)的请求转换为:
http://your.site.com/Page?a=arg1&b=arg2&c=arg3

然后在PHP中,$_GET['a'],$_GET['b']和$_GET['c']都将被设置为相应的值。

查看这本书


2

如果您想要像site.com/42这样做,并通过添加适当的重写规则保留ID = 42的GET变量。例如,假设您正在运行Apache Web服务器,则可以通过以下方式修改.htaccess文件(位于Web根目录中):

RewriteEngine On
RewriteRule ^(.*) /?id=$1 [L]

2
事实上,这不再是一个GET变量了,变量只成为URL的一部分。这些URL被应用程序自定义解析。大多数MVC框架遵循/controller/action/params规则,并根据每个部分的位置来拆分URL:
  • 第一个/controller部分确定使用哪个控制器
  • 第二个/action部分确定调用哪个方法
  • 任何后续参数都只作为接收函数的参数传递,其含义取决于函数和顺序
  • 有些还使用命名参数,如/page:2,因此它们不必依赖正确的顺序
所有这些都可以自定义。您还可以使用Web服务器(例如Apache)将这些类型的URL重写为旧式的GET参数URL,甚至在它们到达应用程序之前。

1
如果您以这种方式传递参数,它们将不再是GET变量,因为它们不是使用传统的? GET语法传递的。它们只是URL的一部分,将由您正在使用的“CMS”框架解析。
但是,如果您恰好传递了一个“传统”的GET变量并希望在服务器上读取它,则必须查阅CMS的文档。如果该框架将使用漂亮的URL,则可能还会删除任何GET变量,因为它们不再必要。例如,CodeIgniter MVC框架(不是自己的CMS,但可以用于构建它们)就是这样做的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接