Laravel - 路线 GET|HEAD

Posted

技术标签:

【中文标题】Laravel - 路线 GET|HEAD【英文标题】:Laravel - Routes GET|HEAD 【发布时间】:2014-04-02 20:07:38 【问题描述】:

当我执行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          |               |
+--------+----------------------------------+------------------------------+--------------------------------------+----------------+---------------+

【问题讨论】:

能否请您出示您的 routes.php 文件? 【参考方案1】:

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

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

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

这可以通过观察Content-Length 字段或Last-Modified 字段来实现。

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

您将准确地知道何时检索完整的有效负载。

最大的问题是:当你使用 Route::get() 时,为什么 Laravel 会结合 HEADGET HTTP 动词?

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

来自 HTTP RFC:

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

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

【讨论】:

关于“大问题”:我猜想因为 HEAD 请求应该导致相同的内部操作(只有主体不发送),Laravel 认为总是提供一个 @ 987654336@ 路线与任何GET 路线并排。在极少数和特殊情况下应该存在单独的HEAD,开发人员可以使用Route::match。恕我直言,不值得额外的帮助函数Route::head()【参考方案2】:

以下函数取自Laravel's Illuminate\Routing\Router.php 类,当您使用Route::get() 方法为您的站点/应用程序添加路由时,Laravelurl 添加了这两种方法,这意味着,这些使用get方法注册的urls可以使用GETHEADHTTP方法访问,而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);

【讨论】:

以上是关于Laravel - 路线 GET|HEAD的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 重复的路线名称

Laravel 5 条新路线不起作用

Laravel 5.1 路线未定义

路线在 laravel 4.2 中不起作用

Laravel 重定向到错误的路线

Laravel 5.3路线不起作用