【问题标题】:Pretty URL hides resource using PrettyFacesPretty URL 使用 PrettyFaces 隐藏资源
【发布时间】:2026-02-20 18:00:01
【问题描述】:

我有一个在 PrettyFaces 3.3.3 和 Wildfly 10.1.0.Final 上运行的 web 应用。为了使 URL 更加用户友好,我使用了 PrettyFaces。有效 URL 的示例类似于:

http://www.example.com/en/drinks

在这种情况下,一个 bean 中有两个变量:

private String language;
private String zone;

拥有价值观:

language = "en"
zone = "drinks"

问题是我还有一个带有路径的 CSS 文件:

http://www.example.com/styles/style.css

PrettyFaces 错误地解释了这一点,使我无法访问真实资源:

language = "styles"
zone = "style.css"

我试图找到一种方法告诉 PrettyFaces 不要翻译 CSS 文件的 URL,但我找不到类似的东西。

有没有办法通过保留漂亮的 URL 来访问 CSS 文件?

我当前的 PrettyFaces 配置是:

<url-mapping id="zoneSelected"> 
    <pattern value="/#{navigationController.language}/#{navigationController.zone}" /> 
    <view-id>/faces/index.xhtml</view-id>
</url-mapping>

【问题讨论】:

    标签: jsf resources prettyfaces


    【解决方案1】:

    PrettyFaces 会将任何传入请求与正则表达式进行匹配。

    这样的模式:

    <pattern value="/#{bean.language}/#{bean.zone}" />
    

    会转化成这样的正则表达式:

    /[^/]+/[^/]+
    

    这是因为默认情况下 PrettyFaces 使用 [^/]+ 作为所有路径参数。

    这种通用模式也将匹配其他资源,如 CSS 或图像文件。

    解决此问题的一种方法是自定义 PrettyFaces 将用于路径参数的正则表达式模式。这很容易做到并在此处进行了描述:

    http://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.pathparams.regex

    所以基本上只使用这种模式:

    <pattern value="/#{ /[a-z]{2}/ bean.language }/#{bean.zone}" />
    

    这将转化为:

    /[a-z]{2}/[^/]+
    

    在这种情况下,您的样式表将不再匹配模式。

    【讨论】: