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 会结合 HEAD
和 GET
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()
方法为您的站点/应用程序添加路由时,Laravel
为url
添加了这两种方法,这意味着,这些使用get
方法注册的url
s可以使用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);
【讨论】:
以上是关于Laravel - 路线 GET|HEAD的主要内容,如果未能解决你的问题,请参考以下文章