пояснение как работает переписчик слинга

Я пытаюсь понять, как работает переписывание URL-адреса. Я следую этому URL-адресу -

http://www.cognifide.com/blogs/cq/multidomain-cq-mappings-and-apache-configuration/

Шаги, которые я сделал в среде публикации -

/etc/map.publish/http:

 jcr: primaryType: "sling:OrderedFolder",
 home: {
     sling:internalRedirect: ["/content/geometrixx/en.html"],
     jcr:primaryType: "sling:Mapping",
     sling:match: "localhost:4503/$"
 },
 localhost.4503: {
     sling:internalRedirect: ["/content/geometrixx/en"],
     jcr:primaryType: "sling:Mapping",
     redirect: {
         sling:internalRedirect: ["/content/geometrixx/en/$1","/$1"],
         jcr:primaryType: "sling:Mapping",
         sling:match: "(.+)$"
     }
 }

1) Однако, когда я нажимаю на этот URL:

 http://localhost:4503/products.html then I got 404 error. 

2) Более того, я хочу реализовать, когда пользователь нажимает на этот URL:

  http://localhost:4503/content/geometrixx/en.html then it should open 

  http://localhost:4503/en/products.html. 

Пожалуйста, дайте мне знать, возможно ли это, следуя вышеуказанному подходу

Обновление: я пытаюсь получить доступ через диспетчер. Я использую Apache 2.0 на Windows 7, CQ5.6.0. Мой httpd.conf выглядит так:

 <IfModule disp_apache2.c>
 DispatcherConfig conf/dispatcher.any
 DispatcherLog    logs/dispatcher.log
 DispatcherLogLevel 3
 DispatcherNoServerHeader 0
 DispatcherDeclineRoot 0
 DispatcherUseProcessedURL 0
 DispatcherPassError 0
 </IfModule>
 <VirtualHost *:80>
   ServerName localhost
   DocumentRoot "C:/Apache2/htdocs/content/sitea"
   RewriteEngine On
   RewriteRule ^/$ /content/geometrixx/en.html [PT,L]
   RewriteCond %{REQUEST_URI} !^/apps
   RewriteCond %{REQUEST_URI} !^/content
   RewriteCond %{REQUEST_URI} !^/etc
   RewriteCond %{REQUEST_URI} !^/home
   RewriteCond %{REQUEST_URI} !^/libs
   RewriteCond %{REQUEST_URI} !^/tmp
   RewriteCond %{REQUEST_URI} !^/var
   RewriteRule ^/(.*)$ /content/geometrixx/en/$1 [PT,L]
    <Directory "C:/Apache2/htdocs/content/sitea">
     <IfModule disp_apache2.c>
           SetHandler dispatcher-handler
           ModMimeUsePathInfo On
         </IfModule>
         Options Indexes FollowSymLinks MultiViews
         AllowOverride all
         Order Allow,Deny
         Allow from all
 </Directory>
 </VirtualHost> 

3) Теперь, когда я нажимаю: localhost/content/geometrixx/en/products.html, я получаю страницу, и диспетчер также кэширует страницу. Но после того, как я перейду на любую страницу, например «Продукты» -> «Треугольник», URL-адрес станет локальным: 4503/products/triangle.html из-за сопоставления Sling. это ожидается? Поскольку диспетчер не знает о сопоставлении Sling, он не кэширует треугольник.html. Как заставить кэш диспетчера работать?

4) Поскольку существует правило перезаписи (RewriteRule ^/(.*)$ /content/geometrixx/en/$1 [PT,L]), если я нажму на этот URL-адрес localhost/triangle.html, я должен получить правильную страницу как localhost/content/geometrixx/en/triangle.html, но я получаю ошибку 404.


person Pakira    schedule 09.02.2014    source источник
comment
может кто-нибудь помочь?   -  person Pakira    schedule 10.02.2014


Ответы (1)


Я использовал эти сопоставления на CQ 5.6.1, и они, кажется, работают. Пожалуйста, найдите JSON, экспортированный из моего экземпляра:

{
  "jcr:primaryType": "sling:OrderedFolder",
  "home": {
    "sling:internalRedirect": "/content/geometrixx/en.html",
    "sling:match": "localhost.4503/$",
    "jcr:primaryType": "sling:Mapping",
  },
  "localhost.4503": {
    "sling:internalRedirect": "/content/geometrixx/en",
    "jcr:primaryType": "sling:Mapping",
    "redirect": {
      "sling:internalRedirect": [
        "/content/geometrixx/en/$1",
        "/$1"
      ],
      "sling:match": "(.+)$",
      "jcr:primaryType": "sling:Mapping",
    }
  }
}

Единственное изменение, которое я сделал, — это разделитель портов в первом столбце sling:match — я заменил его с двоеточия на точку. Чтобы убедиться, что мы работаем с одной конфигурацией, я создал Пакет CQ, содержащий мою конфигурацию.

Эта конфигурация делает 3 вещи:

  1. Когда пользователь запрашивает http://localhost:4503/, он будет перенаправлен на /content/geometrixx/en.html
  2. Когда пользователь запрашивает http://localhost:4503/products.html (или любую другую страницу из поддерева /content/geometrixx/en), он будет перенаправлен на /content/geometrixx/en/products.html.
  3. Все пути в тегах <a>, <img> и <form> будут сопоставлены с их короткой версией, например:

<a href="/content/geometrixx/en/products.html">Products</a>

будет переписан на

<a href="/products.html">Products</a>


О вашем втором вопросе: сопоставления Sling не позволяют перенаправлять пользователя на сопоставленную версию URL-адреса. Сайт Geometrixx использует BrowserMap, которая (среди прочего) перенаправляет пользователя на укороченную версию URL-адреса с помощью JavaScript. Поэтому введите следующий URL:

http://locahost:4503/content/geometrixx/en/products.html

перенаправит вас на /products.html через секунду после загрузки страницы.

person Tomek Rękawek    schedule 10.02.2014
comment
Спасибо, Томек, ваше решение сработало как всегда! Что касается моего второго вопроса: хочу ли я открыть эту страницу (localhost:4503/products.html), когда пользователь нажал этот URL-адрес - localhost:4503/content/geometrixx/en.html, затем выполните Мне нужно использовать библиотеку BrowserMap? нельзя ли использовать sling:Mapping? - person Pakira; 10.02.2014
comment
Да, Sling не предлагает эту функцию. Вы должны реализовать это самостоятельно или использовать BrowserMap. - person Tomek Rękawek; 11.02.2014
comment
не могли бы вы потратить несколько минут, чтобы изучить вопросы 3 и 4? Еще раз спасибо за помощь - person Pakira; 15.02.2014
comment
Q3) Правила перезаписи должны преобразовывать products/triangle.html в /content/geometrixx/en/products/triangle.html, а второй путь — это место, где страница будет кэшироваться. Однако вам нужно установить для DispatcherUseProcessedURL значение 1, чтобы это работало. Q4) /content/geometrixx/en/triangle.html страницы нет — вы пропустили products часть. - person Tomek Rękawek; 17.02.2014