[英]How Laravel handle url-rewriting?
仅出于好奇... 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]
使用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"
这不是Laravel特有的,而是任何PHP框架如何处理它。
首先,不需要将查询字符串添加到index.php
,因为它已经隐式存在。 参见RewriteRule
...
修改查询字符串默认情况下,查询字符串不变。 但是,您可以在包含查询字符串部分的替换字符串中创建URL。 只需在替换字符串中使用问号来表示应将以下文本重新插入到查询字符串中。 当您要删除现有的查询字符串时,只需用问号结束替换字符串。 要组合新旧查询字符串,请使用[QSA]标志。
@iainn已经提到了超全局变量$_GET
和$_POST
。 还有$_SERVER
,其中包含REQUEST_URI
或PATH_INFO
。 有了这些,您就可以获取所请求的URL,而无需将其作为查询字符串的一部分显式传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.