Url rewriting 为eXist db中的嵌套目录重写URL

Url rewriting 为eXist db中的嵌套目录重写URL,url-rewriting,exist-db,Url Rewriting,Exist Db,我想将安全页面分离到一个目录中 最简单的情况是: home/ |-index.html |-controller.xql |-secure/ |-authentication-test.html +-security.html 目前,除了从secure目录/路径中转义外,所有操作都正常。问题是当我登录时,index.html页面上的每个链接都会以url的/secure/部分作为前缀。这意味着,在注销后,我不会被发送到index.html,而是发送到/secu

我想将安全页面分离到一个目录中

最简单的情况是:

home/
  |-index.html
  |-controller.xql
  |-secure/
      |-authentication-test.html
      +-security.html
目前,除了从
secure
目录/路径中转义外,所有操作都正常。问题是当我登录时,
index.html
页面上的每个链接都会以url的
/secure/
部分作为前缀。这意味着,在注销后,我不会被发送到
index.html
,而是发送到
/secure/index.html
,因为它不存在。它让我想起了上下文之类的东西。我不知何故被锁定在嵌套目录中,“上下文已更改”。我还没有更改
控制器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>
xquery版本“3.0”;
导入模块名称空间登录=”http://exist-db.org/xquery/login“at”资源:org/exist/xquery/modules/persistentlogin/login.xql;
声明变量$exist:path external;
声明变量$exist:外部资源;
声明变量$exist:控制器外部;
声明变量$exist:前缀external;
声明变量$exist:root external;
声明变量$local:login\u domain:=“karolinum-x”;
声明变量$local:user:=$local:login|u domain | |'.user';
let$logout:=请求:获取参数(“logout”,())
让$set user:=login:set user($local:login\u domain,(),false())
返回
如果($exist:path eq“”),则
否则,如果($exist:path eq/),则
否则如果($exist:path eq”/secure/authentication test.html),则
如果(请求:获取属性(“karolinum-x.user”)),则
其他的
否则如果(以($exist:resource,“.html”)结尾),则
(:从共享资源应用程序加载以$shared开头的资源路径:)
否则如果(包含($exist:path,“/$shared/”),则
其他的
(:其他所有内容都已通过:)

您面临的问题归结为:您的主模板
templates/page.html
包含带有相对链接的菜单项,因此当您进入子目录时,链接会断开。这将发生在您使用需要在URL层次结构的不同级别显示的相对链接的任何其他页面中。以下是您的
模板/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.html
test/url.html
都是相对的。因此,如果您从
index.html
开始,单击指向
test/url.html
的菜单链接,新的菜单项与
test
目录相关,因此单击任一菜单项都会将您带到
test/index.html
test/test/url.html
-依此类推。要解决此问题,您至少有三种选择:

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

(2) 使用类似于controller.xql处理
$shared
-前缀URL的方法。例如,您可以创建链接
$app/index.html
,然后向controller.xql添加条件以处理
$app
-前缀url,如
$app/index.html
$app/test/url.html
。这会导致多个URL解析到同一个资源,所以我并不特别喜欢这种方法,但它很有效


或者(3)像hsg shell应用程序那样,使用对函数的模板调用,如
app:fix links
。见和。虽然这意味着在应用程序中以这种方式处理的所有链接前面加上
$app
,但它确实为深入嵌套的URL以及应用程序结构和名称的未来更改等提供了极大的灵活性。

您面临的问题归结为:您的主模板,
模板/page.html
,包含具有相对链接的菜单项,因此当您进入子目录时,链接会断开。这将发生在您使用需要在URL层次结构的不同级别显示的相对链接的任何其他页面中。以下是您的
模板/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.html
test/url.html
都是相对的。因此,如果您从
index.html
开始,单击指向
test/url.html
的菜单链接,新的菜单项与
test
目录相关,因此单击任一菜单项都会将您带到
test/index.html
test/test/url.html
-依此类推。要解决此问题,您至少有三种选择:

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

(2) 使用类似于controller.xql处理
$shared
-前缀URL的方法。例如,您可以创建链接
$app/index.html
,然后向controller.xql添加条件以处理
$app
-前缀url,如
$app/index.html
$app/test/url.html
。这会导致多个URL解析到同一个资源,所以我并不特别喜欢这种方法,但它很有效

或者(3)使用模板调用