Having links relative to root?
A root-relative URL starts with a /
character, to look something like <a href="/directoryInRoot/fileName.html">link text</a>
.
The link you posted: <a href="fruits/index.html">Back to Fruits List</a>
is linking to an html file located in a directory named fruits
, the directory being in the same directory as the html page in which this link appears.
To make it a root-relative URL, change it to:
<a href="/fruits/index.html">Back to Fruits List</a>
Edited in response to question, in comments, from OP:
So doing / will make it relative to www.example.com, is there a way to specify what the root is, e.g what if i want the root to be www.example.com/fruits in www.example.com/fruits/apples/apple.html?
Yes, prefacing the URL, in the href
or src
attributes, with a /
will make the path relative to the root directory. For example, given the html page at www.example.com/fruits/apples.html
, the a
of href="/vegetables/carrots.html"
will link to the page www.example.com/vegetables/carrots.html
.
The base
tag element allows you to specify the base-uri for that page (though the base
tag would have to be added to every page in which it was necessary for to use a specific base, for this I'll simply cite the W3's example:
For example, given the following BASE declaration and A declaration:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>Our Products</TITLE>
<BASE href="http://www.aviary.com/products/intro.html">
</HEAD>
<BODY>
<P>Have you seen our <A href="../cages/birds.gif">Bird Cages</A>?
</BODY>
</HTML>
the relative URI "../cages/birds.gif" would resolve to:
http://www.aviary.com/cages/birds.gif
Example quoted from: http://www.w3.org/TR/html401/struct/links.html#h-12.4.
Suggested reading:
- http://www.motive.co.nz/glossary/linking.php
- http://www.communitymx.com/content/article.cfm?cid=AEDCC52C4AD230AD
Using Root-Relative Links With Subdomain
Is
<base>
incompatible with root-relative links?
No, but an absolute path is still an absolute path. It will resolve relative to http://localhost:8080/site/
by dropping /site/
.
If you want to use absolute paths and not keep your development sites in subdirectories, then configure your HTTP server to use Virtual Name Hosting.
Add custom hostnames (either in the DNS server for your LAN or in the hosts
file on your development system), such as site.localhost
, and set the DocumentRoot
in a virtual host.
Regex to replace relative link with root relative link
If you just want to change the base URI, you can try the BASE
element:
<base href="/basepath/">
But note that changing the base URI affects all relative URIs and not just relative URI paths.
Otherwise, if you really want to use regular expression, consider that a relative path like you want must be of the type path-noscheme (see RFC 3986):
path-noscheme = segment-nz-nc *( "/" segment )
segment = *pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
So the begin of the URI must match:
^([a-zA-Z0-9-._~!$&'()*+,;=@]|%[0-9a-fA-F]{2})+($|/)
But please use a proper HTML parser for parsing the HTML an build a DOM out of that. Then you can query the DOM to get the href
attributes and test the value with the regular expression above.
Absolute or Relative URL if my website may not be at the root folder?
I think you should use relative urls, and concentrate your searchs on how to use relative urls in templates, that would be resolved relatively to the final page.
I don't know the technology you are using for templating, but I see two common solutions :
- declare a "relative path" variable in the template, and then override it in the different pages, with the new relative path. Use this relative path as a prefix for all urls
- delegate urls construction to a service that would know the final page. Somethinkg like
resolveUrl(..)
Absolute vs relative URLs
In general, it is considered best-practice to use relative URLs, so that your website will not be bound to the base URL of where it is currently deployed. For example, it will be able to work on localhost, as well as on your public domain, without modifications.
Related Topics
Curve Bottom Side of the Div to the Inside With Css
Margin-Top Push Outer Div Down
Make Flex Items Take Content Width, Not Width of Parent Container
Can You Provide Examples of Parsing Html
Col-Xs-*' Not Working in Bootstrap 4
How to Blur(Css) Div Without Blur Child Element
Using Position Relative/Absolute Within a Td
Using Flex Order Property to Re-Arrange Items For Desktop and Mobile Views
How to Convert an HTML Element to a Canvas Element
Centered Elements Inside a Flex Container Are Growing and Overflowing Beyond Top
How to Create Your Own HTML Tag in Html5
Force to Open "Save As..." Popup Open At Text Link Click For Pdf in Html
Make Footer Stick to Bottom of Page Correctly
Make Absolute Positioned Div Expand Parent Div Height
Svgs Not Scaling Properly in Ie - Has Extra Space
Remove White Space Above and Below Large Text in an Inline-Block Element