只是为了好奇...... 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]
答案 0 :(得分:2)
使用RewriteRule
时,有两种主要的操作形式:内部和外部重定向。
使用[R]
标记的外部重定向将告诉您的浏览器重定向到新的网址,例如
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"
答案 1 :(得分:1)
这不是特定于Laravel,而是任何PHP框架如何处理它。
首先,不需要向index.php
添加查询字符串,因为它已经隐含了。见RewriteRule
...
修改查询字符串默认情况下,查询字符串不会更改。但是,您可以在包含查询字符串部分的替换字符串中创建URL。只需在替换字符串中使用问号,即表示应将以下文本重新注入查询字符串。如果要删除现有查询字符串,请仅使用问号结束替换字符串。要组合新旧查询字符串,请使用[QSA]标志。
@iainn已经提到过超级全球$_GET
和$_POST
。还有$_SERVER
,其中包含REQUEST_URI
或PATH_INFO
。通过这些,您可以获取请求的URL,而不会将其作为查询字符串的一部分显式传递。