joostvanveen/laravel-litespeedcache

Laravel 实现的 joostvanveen/litespeedcache。

v1.3.0 2019-05-14 08:53 UTC

This package is auto-updated.

Last update: 2024-09-14 20:30:34 UTC


README

coverage

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.enabledlitespeedcache.defaults.typelitespeedcache.defaults.lifetimelitespeedcache.defaults.excludedUrislitespeedcache.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 来禁用默认中间件。

  1. 将配置设置发布到您的 Laravel 项目中。
php artisan vendor:publish --provider="Joostvanveen\LaravelLitespeedcache\LitespeedCacheServiceProvider" --tag=config
  1. use_middleware 设置为 false
<?php

return [
    'defaults' => [
        'enabled' => true, 
        'use_middleware' => false, // Set Litespeed Cache Middleware to inactive
        'type' => 'public', 
        'lifetime' => 240, 
    ],
];
  1. 创建中间件类
php artisan make:middleware LitespeedCache
  1. 编辑您的中间件
<?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

贡献

欢迎拉取请求。对于重大更改,请首先打开一个问题来讨论您想更改的内容。

请确保根据需要更新测试。

变更日志

变更日志

许可

MIT