【发布时间】:2010-03-11 03:29:53
【问题描述】:
我认为这是一个菜鸟问题,但这里是。
我试图更好地理解 PHP 中的 $_GET 变量。许多 CMS 等将 site.com/?ID=42 之类的内容转换为 site.com/42 之类的内容
我的问题是,发生这种情况时 $_GET 变量会发生什么?我尝试在页面加载时打印 GET 数组,但它是空的。
【问题讨论】:
我认为这是一个菜鸟问题,但这里是。
我试图更好地理解 PHP 中的 $_GET 变量。许多 CMS 等将 site.com/?ID=42 之类的内容转换为 site.com/42 之类的内容
我的问题是,发生这种情况时 $_GET 变量会发生什么?我尝试在页面加载时打印 GET 数组,但它是空的。
【问题讨论】:
他们这样做的方式是使用mod_rewrite
基本上你有网络服务器“重写”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' ] 都设置为值。
【讨论】:
您可以执行类似 site.com/42 的操作,并通过添加适当的重写规则来保留 ID=42 的 GET 变量。例如,假设您正在运行 Apache Web 服务器,您可以使用以下内容修改 .htaccess 文件(位于您的 webroot 目录中):
RewriteEngine On
RewriteRule ^(.*) /?id=$1 [L]
【讨论】:
问题是,它不再是 GET 变量,变量只是成为 URL 的一部分。这些 URL 然后由应用程序自定义解析。大多数 MVC 框架遵循/controller/action/params 的规则,并根据部件的位置分解 URL:
/controller 部分决定使用哪个控制器/action部分决定调用哪个方法/page:2,因此它们不必依赖正确的顺序这都可以自定义。您还可以使用您的 Web 服务器(例如 Apache)将这些类型的 URL 重写为旧的 GET 参数 URL,甚至在它们到达您的应用程序之前。
【讨论】:
如果您以这种方式传递参数,它们将不再是 GET 变量,因为它们不是使用传统的 ?GET 语法传递的。它们只是 URL 的一部分,将由您正在使用的“CMS”框架解析。
但是,如果您碰巧传递了“传统”GET 变量并希望在服务器上读取它,则必须查阅 CMS 的文档。如果框架要使用漂亮的 URL,它可能还会删除任何 GET 变量,因为它们不再是必需的。例如,CodeIgniter MVC 框架(它本身不是 CMS,但可以用来构建它们)就是这样做的。
【讨论】: