【问题标题】:Is it possible to add cdn.mydomain.com/assets in Laravel asset() function?是否可以在 Laravel 的asset() 函数中添加 cdn.mydomain.com/assets?
【发布时间】:2021-07-18 07:37:55
【问题描述】:

我希望将我网站的资产加载为 cdn.mydomain.com/asset_path 而不是 mydomain.com/asset 路径。

不使用任何云 CDN。

简而言之,我想要这个<img src="{{asset('/js/app.js')}}" > =<img src="mydomain.com/js/app.js" >

成为这种形式

<img src="{{asset('/js/app.js')}}" > =<img src="cdn.mydomain.com/js/app.js" >

请看一下这个包,它的作用相同,但 laravel 8 不支持 https://github.com/damianromanowski/simplecdn

任何帮助将不胜感激。 提前致谢

注意:我使用的是 Laravel 8

【问题讨论】:

  • \vendor\laravel\framework\srcIlluminate\Routing\UrlGenerator 类及其asset($path, $secure = null) 方法上更改供应商文件是个坏主意。此类正在通过url 键放入容器中。
  • Laravel 确实支持这一点。您可以在the docs 中了解它

标签: php css laravel file-upload helper


【解决方案1】:

您可以通过在 .env 文件中设置 ASSET_URL 变量来配置资产 URL 主机。如果您将资产托管在 Amazon S3 或其他 CDN 等外部服务上,这将非常有用:

// ASSET_URL=http://cdn.mydomain.com

$url = asset('js/app.js'); // http://cdn.mydomain.com/js/app.js

https://laravel.com/docs/8.x/helpers#method-asset

【讨论】:

  • 在我的视图文件中,我有很多刀片文件,我有 URL()->asset('path') 。我遵循这个想法,那么文件中会有很多变化,跨度>
  • 我想要一些不需要更改大量文件的概念。
【解决方案2】:

我自己通过添加中间件和更改发送到浏览器的响应来解决。

受上述软件包的启发。

<?PHP

  namespace App\Http\Middleware;

  use Closure;
  use Illuminate\Http\Request;

 class CdnMiddleware
 {
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle(Request $request, Closure $next)
{
    $response = $next($request);
    $output = $response->getOriginalContent();
    $rules = array(

        array(
            // 'url'        => array('http://images.example.com/', 'http://images2.example.com/'),
            // 'remove' => 'assets/images/',
            'pattern'   => 'png|tif|tiff|gif|jpeg|jpg|jif|jfif|jp2|jpx|j2k|j2c|ico',
            'enabled'   => true
        ),
        
        array(
            'pattern'   => 'css',
            'enabled'   => true
        ),
        
        array(
            'pattern'   => 'js',
            'enabled'   => true
        ),
        
        array(
            'pattern'   => 'asf|avi|flv|m1v|m2v|m4v|mkv|mpeg|mpg|mpe|ogg|rm|wmv|mp4|webm',
            'enabled'   => true
        )
        
        );
        $url =  array(

            'http://cdn.my-domain.com/'
    
        );
    if (is_string($output) || method_exists($output, '__toString')) {
        $urls = preg_match_all("#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|[^[:punct:]\s]|/)#", $output, $matches);

        foreach ($matches[0] as $uri)
            foreach ($rules as $group)
                if (@$group['enabled'] && preg_match('/\.(' . @$group['pattern'] . ')(?:[\?\#].*)?$/i', $uri, $matchess))
                {
                    $config_url = $url;

                    $config_remove = '';
                    $main_url = \URL::to('/');
                    $asset_path = str_replace(str_finish(strval($main_url), '/'), '', $uri);

                    // check for external URLs. so far all the urls with current hostname
                    // has been removed. If there is a still URL which has http://---- that means
                    // its an external URL
                    $extMatch = [];
                    $extUrl = preg_match("#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|[^[:punct:]\s]|/)#", $asset_path, $extMatch );

                    if(isset($extMatch[0]))
                        continue;

                    if (isset($group['url']))
                        $config_url = $group['url'];

                    if (isset($group['remove']))
                        $config_remove = $group['remove'];

                    if ($config_remove)
                        $asset_path = str_replace(str_finish($config_remove, '/'), '', $asset_path);

                    $cdn_url = is_array($config_url) ? $config_url[array_rand($config_url)] : $config_url;
                    $output = str_replace($uri, str_finish($cdn_url, '/') . $asset_path, $output);
                }

        $response->setContent($output);
    }
    //dd($response->getOriginalContent());
    return $response;
}

}

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2021-09-28
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多