使用 RegexpVirtualURIMapping 映射到 Magnolia 中的静态目录

Posted

技术标签:

【中文标题】使用 RegexpVirtualURIMapping 映射到 Magnolia 中的静态目录【英文标题】:Using RegexpVirtualURIMapping to map to static directories in Magnolia 【发布时间】:2016-05-05 16:09:03 【问题描述】:

我想设置 magnolia,以便对目录的所有请求都将重定向到静态资源。例如:如果一个 URL 匹配 /campaign/(.*) 它将转发到 /static/campaign/ 而不重定向。

/                        => [no change]
/campaign/               => /static/campaign/index.html
/campaign/styles/all.css => /static/campaign/styles/all.css

在 JCR 中,我将 /modules/pages/virtualURIMapping 设置为:

<?xml version="1.0" encoding="UTF-8"?>
<sv:node sv:name="virtualURIMapping" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <sv:property sv:name="jcr:primaryType" sv:type="Name">
    <sv:value>mgnl:content</sv:value>
  </sv:property>
  <sv:node sv:name="default">
    <sv:property sv:name="jcr:primaryType" sv:type="Name">
      <sv:value>mgnl:contentNode</sv:value>
    </sv:property>
    <sv:property sv:name="jcr:uuid" sv:type="String">
      <sv:value>c68cde34-eaaf-480d-b1fa-7ea98aa772b0</sv:value>
    </sv:property>
    <sv:property sv:name="class" sv:type="String">
      <sv:value>info.magnolia.cms.beans.config.RegexpVirtualURIMapping</sv:value>
    </sv:property>
    <sv:property sv:name="fromURI" sv:type="String">
      <sv:value>/campaign/([0-9A-Z]*)</sv:value>
    </sv:property>
    <sv:property sv:name="toURI" sv:type="String">
      <sv:value>forward:/static/campaign/$1</sv:value>
    </sv:property>
  </sv:node>
</sv:node>

我已重新启动服务器,但收到以下异常:

ERROR info.magnolia.rendering.engine.RenderingFilter  - RepositoryException while reading Resource [/static]
javax.jcr.PathNotFoundException: /static

【问题讨论】:

【参考方案1】:

似乎对 /static 的转发进入了渲染过滤器。您需要通过为 /static/* 添加旁路来排除它

【讨论】:

【参考方案2】:

您希望 Magnolia 忽略的任何内容都需要在整个过滤器链中(如果您还想忽略身份验证)或至少在过滤器的 cms 子链中被绕过。 要使 Magnolia 忽略某些 URI,您需要配置旁路,如其他答案中所述。

HTH, 一月

【讨论】:

【参考方案3】:

通过创建以下重写过滤器而不是添加到 JCR 来解决它:

web.xml:

<filter>
    <filter-name>campaign</filter-name>
    <filter-class>com.britishgas.contenthub.filters.CampaignRewriteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>campaign</filter-name>
    <url-pattern>/campaign/*</url-pattern>
</filter-mapping>

Rewrite Filter:

package com.example;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class CampaignRewriteFilter implements Filter 

    private RequestDispatcher defaultRequestDispatcher;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
        this.defaultRequestDispatcher = filterConfig.getServletContext().getNamedDispatcher("default");
    

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
        HttpServletRequest req = (HttpServletRequest) request;
        String uri = req.getRequestURI().replaceFirst("/campaign/", "/static/campaign/");
        RequestDispatcher dispatcher = request.getRequestDispatcher(uri);
        dispatcher.forward(request, response);
    

    @Override
    public void destroy() 

    

【讨论】:

以上是关于使用 RegexpVirtualURIMapping 映射到 Magnolia 中的静态目录的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)