Laravel - 路线GET | HEAD

时间:2014-03-01 18:37:08

标签: laravel laravel-routing

当我执行php artisan routes时,我的应用的GET请求有一个|HEAD。拥有|HEAD的目的是什么?

routes.php文件

+--------+----------------------------------+------------------------------+--------------------------------------+----------------+---------------+
| Domain | URI                              | Name                         | Action                               | Before Filters | After Filters |
+--------+----------------------------------+------------------------------+--------------------------------------+----------------+---------------+
|        | GET|HEAD /                       | home                         | HomeController@home                  |                |               |
|        | GET|HEAD user/{username}         | profile-user                 | ProfileController@user               |                |               |
|        | GET|HEAD account/change-password | account-change-password      | AccountController@getChangePassword  | auth           |               |
|        | GET|HEAD asset/encode-file/{id}  | encode-file                  | EncodeController@getEncode           | auth           |               |
|        | GET|HEAD asset/edit-file/{id}    | edit-file                    | AssetController@getEdit              | auth           |               |
|        | GET|HEAD asset/delete-file/{id}  | delete-file                  | AssetController@deleteDestroy        | auth           |               |
|        | GET|HEAD asset/upload-file-form  | upload-file-form             | AssetController@getUploadCreate      | auth           |               |
|        | GET|HEAD asset/library           | asset-library                | AssetController@getAssetLib          | auth           |               |
|        | GET|HEAD account/sign-out        | account-sign-out             | AccountController@getSignOut         | auth           |               |
|        | GET|HEAD account/activate/{code} | account-activate             | AccountController@getActivate        | guest          |               |
|        | GET|HEAD account/forgot-password | account-forgot-password      | AccountController@getForgotPassword  | guest          |               |
|        | GET|HEAD account/recover/{code}  | account-recover              | AccountController@getRecover         | guest          |               |
|        | GET|HEAD account/sign-in         | account-sign-in              | AccountController@getSignIn          | guest          |               |
|        | GET|HEAD account/create          | account-create               | AccountController@getCreate          | guest          |               |
+--------+----------------------------------+------------------------------+--------------------------------------+----------------+---------------+

2 个答案:

答案 0 :(得分:3)

以下函数来自Laravel' Illuminate\Routing\Router.php类,当您使用Route::get()方法为您的网站/应用添加路由时,Laravel会添加两种方法url,这意味着,可以使用urlget GET方法访问使用HEAD方法注册的这些HTTP,并且HEAD只是另一个HTTP动词/方法,用于发出HEAD请求。

/**
 * Register a new GET route with the router.
 *
 * @param  string  $uri
 * @param  \Closure|array|string  $action
 * @return \Illuminate\Routing\Route
 */
public function get($uri, $action)
{
    return $this->addRoute(array('GET', 'HEAD'), $uri, $action);
}

答案 1 :(得分:3)

HEAD请求几乎与GET请求完全相同,它们只有一个基本方面不同: HEAD响应不应包含有效负载(实际数据) )。

这使得 HEAD HTTP动词成为管理当前缓存数据有效性的基础。

如果您的数据不是最新的,HEAD请求的响应中的标题字段的值将发出警告。之后,您可以发出正确的GET请求来检索更新的数据。

例如,可以通过观察Content-Length字段或Last-Modified字段来实现此目的。

使用大型有效负载时,缓存数据并在实际HEAD之前发出GET请求以检查当前数据的有效性,这可以为您节省大量资金消耗。

您将准确了解何时检索完整的有效负载。

最大的问题是:当您使用HEAD时,为什么Laravel会合并GETRoute::get()个HTTP动词?

您可以使用Route::match('HEAD')注册您的HEAD请求,但我觉得很奇怪,我们没有Route::head()

来自HTTP RFC:

  

HEAD方法与GET相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同。该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身。此方法通常用于测试超文本链接的有效性,可访问性和最近的修改。

     

对HEAD请求的响应可以是可缓存的,因为响应中包含的信息可用于从该资源更新先前缓存的实体。如果新字段值指示缓存的实体与当前实体不同(如Content-Length,Content-MD5,ETag或Last-Modified中的更改所示),则缓存必须将缓存条目视为陈旧。