0

只是为了好奇...... Laravel 框架如何捕获“获取”参数?

我刚刚打开了他们的.htaccess并找到了下面的内容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

请注意,在这部分中,根本没有将参数传递给index.php

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

最常见的情况是这样的:

RewriteRule ^(.*)$ index.php?getparams=$1 [L]
4

2 回答 2

2

使用时RewriteRule,主要有两种操作形式:内部重定向和外部重定向。

外部的

使用该[R]标志的外部重定向将告诉您的浏览器重定向到一个新的 URL,例如

RewriteRule ^foo bar/ [L,R=PERMANENT]

将告诉浏览器“位于 /foo 的内容实际上可以在 /bar 找到,请重定向用户”。然后浏览器发出一个对 /bar 的新请求,该请求是从头开始处理的。使用此方法时,需要保留查询字符串参数,一般使用 QSA 标志,例如

RewriteRule ^foo bar/ [L,R=301,QSA]

如果它们没有传递给新请求,它们就会丢失。

内部的

另一方面,内部重定向,不要将有关重定向的任何信息发送回浏览器。他们只是告诉 Apache 任何匹配 URL 的请求都应该由给定的文件处理。所以

RewriteRule ^ index.php [L]

来自 Laravel 示例的指示 Apache 所有请求都应由index.php脚本(Laravel 前端控制器)处理。查询字符串仍可作为原始请求的一部分在 PHP 中访问,但未更改。

Laravel 本身然后使用 PHP 超全局变量($_GET,$_POST等)来填充一个Illuminate\HTTP\Request对象,然后通常在整个应用程序中使用该对象来封装对原始请求的访问,例如

# HTTP Request = /?foo=bar
echo $request->get('foo');
// "bar"
于 2016-05-24T14:03:39.537 回答
1

这不是 Laravel 特有的,而是任何 PHP 框架如何处理它。

首先,不需要向 中添加查询字符串index.php,因为它已经隐式存在。看RewriteRule

...
修改查询字符串

默认情况下,查询字符串会原封不动地传递。但是,您可以在包含查询字符串部分的替换字符串中创建 URL。只需在替换字符串中使用问号来指示应将以下文本重新注入到查询字符串中。当您想删除现有的查询字符串时,只用问号结束替换字符串。要组合新旧查询字符串,请使用 [QSA] 标志。

@iainn 已经提到了超全局变量$_GET$_POST. 还有$_SERVER, 其中包含 - 除许多其他外 -REQUEST_URIPATH_INFO. 使用这些,您可以获取请求的 URL,而无需将其作为查询字符串的一部分显式传递。

于 2016-05-24T15:17:18.327 回答