how sling rewriter works clarification
aem, apache, sling, url-rewriting
Solution
I have used these mapping on CQ 5.6.1 and they seem to work. Please find JSON exported from my instance:
{
"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",
}
}
}
The only change I've made is the port separator in the first `sling:match` column - I have changed it form colon to a dot. Just to be sure we're working on the same configuration, I've created a CQ package containing my config.
This configuration makes 3 things:
- When user requests `http://localhost:4503/` they will be redirected to `/content/geometrixx/en.html`
- When user requests `http://localhost:4503/products.html` (or any other page from the `/content/geometrixx/en` subtree) they will be redirected to `/content/geometrixx/en/products.html`.
- All paths in `<a>`, `<img>` and `<form>` tags will be mapped to their short version, eg.:
`<a href="/content/geometrixx/en/products.html">Products</a>`
will be rewritten to
`<a href="/products.html">Products</a>`
About your second question - Sling mappings doesn't allow to redirect user to the mapped version of the URL. Geometrixx site uses BrowserMap library, which (amongst other things) redirect user to the shortened version of the URL using JavaScript. That's why entering following URL:
http://locahost:4503/content/geometrixx/en/products.html
will redirect you to to `/products.html` a second after the page is loaded.
Problem
I am trying to understand how sling url rewrite works. I'm following this url - http://www.cognifide.com/blogs/cq/multidomain-cq-mappings-and-apache-configuration/ Steps I've done in publish environment - /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) However, when I hit this url : ``` http://localhost:4503/products.html then I got 404 error. ``` 2) Moreover, I want to implement when user hit on this url : ``` http://localhost:4503/content/geometrixx/en.html then it should open http://localhost:4503/en/products.html. ``` Please let me know is it possible by following the above approach Update: I'm trying to access through dispatcher. I'm using Apache 2.0 on windows 7, CQ5.6.0. My httpd.conf looks like below - ``` <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) Now, when I hit : localhost/content/geometrixx/en/products.html then I get the page and dispatcher also cache the page. But after if I navigate to any page for example Products ->Triangle then URL becomes localhost:4503/products/triangle.html due to Sling mapping. is this expected? As dispatch does not know about Sling mapping hence it does not cache triangle.html. How to make dispatcher cache work? 4) As the rewriter rule is there(RewriteRule ^/(.*)$ /content/geometrixx/en/$1 [PT,L]), if I hit this url localhost/triangle.html then I should get the proper page as localhost/content/geometrixx/en/triangle.html but I get 404 error.