joostvanveen / laravel-litespeedcache
Laravel 实现的 joostvanveen/litespeedcache。
Requires
- php: >=7.1
- joostvanveen/litespeedcache: ^1.0
Requires (Dev)
- orchestra/testbench: ^3.8
- phpunit/phpunit: ^7.5
README
joostvanveen/laravel-litespeedcache
A Laravel wrapper for joostvanveen/litespeedcache. If you wish to use Litespeed Cache outside of Laravel check out this framework agnostic https://github.com/joostvanveen/litespeedcache
安装
使用 composer 安装包
composer require joostvanveen/laravel-litespeedcache
在您的 .htaccess 文件中启用 Litespeed。
<IfModule LiteSpeed>
# Enable public cache
CacheEnable public /
# Enable private cache if you need to
CacheEnable private /
# Check the public cache
CacheLookup public on
# Ignore normal Cache Control headers
CacheIgnoreCacheControl On
# Maximum expiration time in seconds
CacheMaxExpire 604800
</IfModule>
用法
此包添加了 LitespeedCache 缓存外观,方便使用,并设置中间件,根据配置设置自动缓存所有请求。
您可以在配置中设置哪些 URL(例如任何 adminconsole*)和查询字符串不进行缓存。如果您想预览不带缓存的页面,只需将 ?cache_bypass=1 添加到 URL,或设置一个值为 1 的 cache_bypass cookie。
如果您想设置自己的中间件,可以将包设置为 不 使用默认中间件。
配置
要能够调整此包的配置,请将配置文件发布到您的项目 /config 文件夹中,如下所示
php artisan vendor:publish --provider="Joostvanveen\LaravelLitespeedcache\LitespeedCacheServiceProvider" --tag=config
配置文件将以下设置添加到您的 Laravel 配置中
// Cache is enabled config(['litespeedcache.defaults.enabled' => true]); // ESI is enabled config(['litespeedcache.defaults.esiEnabled' => true]); // Whether or not to cache ajax calls config(['litespeedcache.defaults.enable_ajax_cache' => false]); // Array of request methods that should be cached config(['litespeedcache.defaults.cache_http_verbs' => ['GET', 'HEAD']]); // Whether or not to use the deafult middleware that comes with this package config(['litespeedcache.defaults.use_middleware' => true]); // Default cache type config(['litespeedcache.defaults.type' => 'public']); // Default TTL for cache in minutes config(['litespeedcache.defaults.lifetime' => 240]); // Array of URIs that should not be cached, can contain wildcards like '/admin*' config(['litespeedcache.defaults.excludedUris' => [$csrfTokenUri . '*', $csrfFieldUri . '*']]); // Array of query strings that should not be cached, can contain wildcards like '*utm_source=*' config(['litespeedcache.defaults.excludedQueryStrings' => []]); // Array of routes for this package config(['litespeedcache.routes' => ['token' => $csrfTokenUri, 'field' => $csrfFieldUri] ]);
外观
该包将 \Joostvanveen\Litespeedcache\Cache 注册为外观,并设置默认配置值 litespeedcache.defaults.enabled、litespeedcache.defaults.type、litespeedcache.defaults.lifetime、litespeedcache.defaults.excludedUris 和 litespeedcache.defaults.excludedQueryStrings。
use LitespeedCache; [...] // Cache use all default settings from config. LitespeedCache::cache(); // Purge the cache LitespeedCache::purge();
您可以使用 \Joostvanveen\Litespeedcache\Cache 的所有方法,有关完整文档,请参阅 https://github.com/joostvanveen/litespeedcache/blob/master/README.md。
一些示例
// Full options example // You can also set $excludedUris and $excludedQueryStrings in config. $excludedUris = [ 'checkout*', 'admin*', ]; $excludedQueryStrings = [ '*direction=*', ]; LitespeedCache::setType('private')->setLifetime(120) ->addTags(['articles', 'en_GB']) ->addVary('value=mysubdomain') ->setExcludedUrls($excludedUris) ->setExcludedQueryStrings($excludedQueryStrings) ->cache(); // Purge cache using tags. LitespeedCache::addTags('articles')->purge(); // If the lifetime is set to 0 the page will not be cached (new Cache)->setEnabled(true)->setLifetime(0)->cache();
中间件
默认情况下,该包包含一个中间件,它缓存所有页面(除了 cli)。
您可以在 src/Middlewares/Cache.php 中找到此中间件。
如果您想使用自己的中间件,可以通过将配置值 litespeedcache.defaults.use_middleware 设置为 false 来禁用默认中间件。
- 将配置设置发布到您的 Laravel 项目中。
php artisan vendor:publish --provider="Joostvanveen\LaravelLitespeedcache\LitespeedCacheServiceProvider" --tag=config
- 将
use_middleware设置为false
<?php return [ 'defaults' => [ 'enabled' => true, 'use_middleware' => false, // Set Litespeed Cache Middleware to inactive 'type' => 'public', 'lifetime' => 240, ], ];
- 创建中间件类
php artisan make:middleware LitespeedCache
- 编辑您的中间件
<?php namespace App\Http\Middleware; use Closure; use Joostvanveen\LaravelLitespeedcache\Facades\LitespeedCache as LitespeedCacheFacade; class LitespeedCache { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * * @return mixed */ public function handle($request, Closure $next) { $excludedUris = [ 'checkout*', 'admin*', ]; LitespeedCacheFacade::setEnabled(config('litespeedcache.defaults.enabled')) ->setType(config('litespeedcache.defaults.type')) ->setLifetime(config('litespeedcache.defaults.lifetime')) ->setExcludedUrls($excludedUris) ->cache(); return $next($request); } }
在表单请求中缓存和 csrf 令牌
Laravel 使用 csrf 令牌内置安全机制来防止 csrf 攻击,对每个 POST 请求进行检查。
通常,您会使用 csrf_field() 或在 POST ajax 请求中使用类似 $.post(route('my.route'), $('#form').serialize() + "&_token={{ csrf_token() }}); 的方法将 csrf 令牌作为隐藏字段提供在表单中。
当与 Litespeed Cache 或 Varnish 等全页缓存一起使用时,这会引发问题。csrf 是唯一的,不应存储在缓存中。如果这样做,您将使用缓存的 csrf 令牌而不是新的一个,从而导致在执行 POST 请求时出现“此页面已过期”错误。但是,您 确实 想要缓存页面的其余部分。您需要在您的缓存页面中进行打孔。ESI 来拯救。
此包提供两种方式在您的页面中使用 csrf 令牌作为 ESI 块。在构建缓存页面时,ESI 块将被实际的、未缓存的 csrf 令牌替换。这样,您就可以有一个完全缓存的页面,但 同时 有一个未缓存的令牌。
使用以下代码在缓存页面的表单中包含一个隐藏字段,而不是使用csrf_field()。'litespeedcache.routes.field' 路由是本包的一部分,将返回带有 csrf 令牌的隐藏字段。
ESI 辅助函数
本包提供了一些易于使用的辅助函数,以便在您的表单中显示 ESI 块。
{!! getLitespeedCsrfField() !!}
如果启用了 ESI,这将显示正确的 ESI 块;如果 ESI 没有启用,则显示常规的crsf_field()。
// With esi enabled <esi:include src="{{ route('litespeedcache.csrf.field') }}" /> // With esi disabled <input type="hidden" name="_token" value="TGZUHk9BSg6QTH1knqPLPXB20EHKLmqEZSt4f3Uk">
有时您只需要令牌,例如用于 Ajax POST 请求。这就是为什么还有一个特殊的辅助函数,它只返回令牌。
{{ getLitespeedCsrfToken() }}
如果启用了 ESI,这将显示正确的 ESI 块;如果 ESI 没有启用,则显示常规的crsf_token()。
// With esi enabled <esi:include src="{{ route('litespeedcache.csrf.token') }}" /> // With esi disabled TGZUHk9BSg6QTH1knqPLPXB20EHKLmqEZSt4f3Uk
当然,您也可以手动将 ESI 块编码到您的表单中。
<esi:include src="{{ route('litespeedcache.csrf.field') }}" /> <esi:include src="{{ route('litespeedcache.csrf.token') }}" />
您的服务器不支持 ESI 吗?
并非所有 Litespeed 服务器都支持 ESI。如果您在一个不支持 ESI 的 Litespeed 服务器上,您可以使用 Ajax 将未缓存的令牌插入到您的表单中,因为 joostvanveen/litespeecache 永远不会缓存 Ajax 请求。
<script> $(function() { // Populate all csrf tokens by ajax using an uncached route $.get('{{ route('litespeedcache.csrf.token') }}', function(data) { $('input[name="_token"]').val(data.token); }); }); </script>
joostvanveen/litespeedcache 文档
您可以在以下位置找到 Litespeed Cache 文档:https://github.com/joostvanveen/litespeedcache/blob/master/README.md
Litespeed 文档
您可以在以下位置找到 Litespeed Cache 文档:https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:cache:developer_guide:response_headers
贡献
欢迎拉取请求。对于重大更改,请首先打开一个问题来讨论您想更改的内容。
请确保根据需要更新测试。