Laravel如何处理url重写?

时间:2016-05-24 13:31:17

标签: php .htaccess laravel url-rewriting getparameter

只是为了好奇...... 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]

2 个答案:

答案 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_URIPATH_INFO。通过这些,您可以获取请求的URL,而不会将其作为查询字符串的一部分显式传递。