eXist-db中嵌套目录的URL重写

时间:2016-02-23 15:06:37

标签: url-rewriting exist-db

我想将安全页面分成目录。

最简单的方案:

home/
  |-index.html
  |-controller.xql
  |-secure/
      |-authentication-test.html
      +-security.html

目前,除了逃离secure目录/路径外,一切正常。问题是当我登录时,index.html页面上的每个链接都会以url的/secure/部分为前缀。这意味着退出后我不会发送到index.html,而是发送到不存在的/secure/index.html。它让我想起了像 context 这样的东西。我在嵌套目录中以某种方式锁定,“上下文已被更改”。我还没有改变controller-config.xml

我的控制器:

xquery version "3.0";

import module namespace login="http://exist-db.org/xquery/login" at "resource:org/exist/xquery/modules/persistentlogin/login.xql";

declare variable $exist:path external;
declare variable $exist:resource external;
declare variable $exist:controller external;
declare variable $exist:prefix external;
declare variable $exist:root external;

declare variable $local:login_domain := "karolinum-x";
declare variable $local:user := $local:login_domain || '.user';

let $logout := request:get-parameter("logout", ())
let $set-user := login:set-user($local:login_domain, (), false())
return
if ($exist:path eq '') then
    <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
        <redirect url="{request:get-uri()}/"/>
    </dispatch>
else if ($exist:path eq "/") then
    <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
        <redirect url="index.html"/>
    </dispatch>
else if ($exist:path eq "/secure/authentication-test.html") then
    if (request:get-attribute("karolinum-x.user")) then
        <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
            <view>
                <forward url="{$exist:controller}/modules/view.xql">
                    <set-attribute name="isUser" value="true"/>
                    <set-attribute name="$exist:prefix" value="{$exist:prefix}"/>
                    <set-attribute name="$exist:controller" value="{$exist:controller}"/>
                </forward>
            </view>
            <error-handler>
                <forward url="{$exist:controller}/error-page.html" method="get"/>
                <forward url="{$exist:controller}/modules/view.xql"/>
            </error-handler>
        </dispatch>
    else
        <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
            <forward url="{$exist:controller}/security.html"/>
            <view>
                <forward url="{$exist:controller}/modules/view.xql">
                    <set-attribute name="$exist:prefix" value="{$exist:prefix}"/>
                    <set-attribute name="$exist:controller" value="{$exist:controller}"/>
                    <set-header name="Cache-Control" value="no-cache"/>
                </forward>
            </view>
            <error-handler>
                <forward url="{$exist:controller}/error-page.html" method="get"/>
                <forward url="{$exist:controller}/modules/view.xql"/>
            </error-handler>
        </dispatch>
else if (ends-with($exist:resource, ".html")) then
    <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
        <view>
            <forward url="{$exist:controller}/modules/view.xql"/>
        </view>
        <error-handler>
            <forward url="{$exist:controller}/error-page.html" method="get"/>
            <forward url="{$exist:controller}/modules/view.xql"/>
        </error-handler>
    </dispatch>
(: Resource paths starting with $shared are loaded from the shared-resources app :)
else if (contains($exist:path, "/$shared/")) then
    <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
        <forward url="/shared-resources/{substring-after($exist:path, '/$shared/')}">
            <set-header name="Cache-Control" value="max-age=3600, must-revalidate"/>
        </forward>
    </dispatch>
else
    (: everything else is passed through :)
    <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
        <cache-control cache="yes"/>
    </dispatch>

1 个答案:

答案 0 :(得分:2)

您面临的问题归结为:您的主模板templates/page.html包含具有相对链接的菜单项,因此当您下载到子目录时,链接会中断。这将发生在您使用需要在不同级别的URL层次结构中显示的相对链接的任何其他页面中。以下是显示相对链接的templates/page.html的摘录:

<ul class="nav navbar-nav">
    <li class="dropdown" id="about">
        <a href="index.html" class="dropdown-toggle">Home</a>
    </li>
    <li class="dropdown" id="test">
        <a href="test/url.html" class="dropdown-toggle">Test</a>
    </li>
</ul>

此处,index.htmltest/url.html都是相对的。因此,如果从index.html开始,请单击test/url.html的菜单链接,新菜单项相对于test目录,因此单击任一菜单项将转到{{1 }或test/index.html - 依此类推。要解决此问题,您至少有三个选择:

(1)使用硬编码的绝对链接,例如test/test/url.html/exist/apps/my-app/index.html。这是最简单的。

(2)使用类似于controller.xql处理/exist/apps/my-app/test/url.html - 前缀URL的方法。例如,您可以创建链接$shared,然后向controller.xql添加条件以处理$app/index.html - 带前缀的网址,例如$app$app/index.html。这导致多个URL解析为同一个资源,因此我不特别喜欢这种方法,但它可以工作。

或(3)使用模板调用$app/test/url.html之类的函数,就像hsg-shell应用程序一样。请参阅https://github.com/eXistSolutions/hsg-shell/blob/master/modules/app.xqm#L62https://github.com/eXistSolutions/hsg-shell/blob/master/templates/site.html#L45。虽然这意味着在app:fix-links的应用程序中为您希望以这种方式处理的所有链接添加前缀,但它确实为您提供了深度嵌套URL以及应用程序结构和名称等的未来更改的极大灵活性。