Skip to content

Broken Links & 404 Errors

Broken links are the most frequent issue in MkDocs documentation. This page documents the specific problems encountered in the EPMware guides and how to resolve them.

When you click a link and get a 404 error:

  1. Look at the URL in the browser address bar — this is where the browser tried to go.
  2. Determine where it should have gone.
  3. Compare the two to understand what went wrong.

For example, if you clicked a link on the validations page expecting to reach /admin-docs/configuration/member-properties/ but the browser went to /admin-docs/appendices/configuration/member-properties/, the problem is that the link only went up one directory level instead of two — it stayed inside appendices/ instead of reaching the site root.


Symptom: Clicking a link in an HTML card or button on a page inside appendices/ takes you to /admin-docs/appendices/configuration/member-properties/ instead of /admin-docs/configuration/member-properties/.

Cause: The <a href> path uses ../ (one level up) when it needs ../../ (two levels up). Because MkDocs converts validations.md to validations/index.html, the browser sees the page as being inside a validations/ directory within appendices/. Going up one level (../) lands in appendices/, not at the site root.

Solution: Count the directory depth and use the correct number of ../ segments:

<!-- WRONG — goes up one level (stays in appendices/) -->
<a href="../configuration/member-properties/">Property Config →</a>

<!-- CORRECT — goes up two levels (reaches site root) -->
<a href="../../configuration/member-properties/">Property Config →</a>

How to count: From appendices/validations.md, the built URL is appendices/validations/index.html. That is two directories deep from the site root: appendices/validations/. So you need two ../ to reach the root.


Symptom: Clicking a link like [Services](#services) on the Administration index page scrolls to the top of the page or does nothing. No section with that heading exists on the page.

Cause: The content for "Services" was moved to a separate file (services.md) but the link was left as an anchor reference (#services) pointing to a section on the same page.

Solution: Change the anchor link to a file reference:

<!-- WRONG — anchor to a section that doesn't exist on this page -->
- **[Services](#services)** - Monitor and control EPMware background services

<!-- CORRECT — link to the separate file -->
- **[Services](services.md)** - Monitor and control EPMware background services

For HTML links in cards:

<!-- WRONG -->
<a href="#application-migration" class="md-button">Migrate Apps →</a>

<!-- CORRECT -->
<a href="application-migration.md" class="md-button">Migrate Apps →</a>

Symptom: A link works in markdown format ([text](file.md)) but the same path in an HTML <a href> tag produces a 404 or unexpected behavior.

Cause: MkDocs rewrites .md extensions in markdown links but does not rewrite them in HTML href attributes. However, this behavior can vary depending on the MkDocs version and configuration.

Solution: For HTML links, use the directory-style URL that MkDocs generates (without .md), typically with a trailing slash:

<!-- Markdown link — .md is fine, MkDocs rewrites it -->
[Member Properties](../configuration/member-properties.md)

<!-- HTML link — use the built URL format -->
<a href="../configuration/member-properties/">Member Properties</a>

Consistency Tip

For markdown links ([text](path)), include the .md extension. For HTML links (<a href>), use the directory-style URL without .md and with a trailing slash. This follows the conventions established in the EPMware guides.


Problem: Relative Path Resolves Incorrectly Across Sections

Symptom: A link from appendices/oracle-epm-cloud.md to configuration/applications.md produces a URL like /admin-docs/appendices/configuration/applications/ instead of /admin-docs/configuration/applications/.

Cause: Relative paths in HTML links are resolved by the browser from the current page's URL, not from the source file's location. Since oracle-epm-cloud.md becomes appendices/oracle-epm-cloud/index.html, a relative path like ../configuration/applications/ only goes up to appendices/ — not to the site root.

Solution: Use ../../ to go up two levels:

<!-- From appendices/oracle-epm-cloud.md -->
<a href="../../configuration/applications/">Application Config →</a>

Or use markdown links instead, which MkDocs resolves correctly:

[Application Configuration](../configuration/applications.md)

Symptom: A link from administration/index.md to administration/services.md doesn't work as expected.

Cause: Since index.md becomes the administration/ directory page, linking to sibling files requires just the filename (for markdown) or a relative path (for HTML).

Solution:

<!-- Markdown — just use the filename -->
[Services](services.md)
[Application Migration](application-migration.md)
<!-- HTML — reference the built directory -->
<a href="services/" class="md-button">View Services →</a>

Problem: Absolute Path Works Locally But Not on GitHub Pages

Symptom: A link like <a href="/configuration/applications/"> works on localhost:8000 but returns 404 on the GitHub Pages site.

Cause: The GitHub Pages site is served from a subdirectory (e.g., /admin-docs/), but the absolute path starts from the domain root (/). Locally, the site root is /, so it works; on GitHub Pages, the site root is /admin-docs/.

Solution: If using absolute paths, include the full base path:

<!-- WRONG — missing the base path -->
<a href="/configuration/applications/">Applications →</a>

<!-- CORRECT — includes the site base path -->
<a href="/admin-docs/configuration/applications/">Applications →</a>

Better yet, use relative paths to avoid this dependency entirely.


This table shows the correct path format for common cross-section links:

From File To File Markdown Link HTML href
configuration/index.md configuration/applications.md [Apps](applications.md) applications/
configuration/applications.md deployment/index.md [Deploy](../deployment/index.md) ../../deployment/
appendices/validations.md configuration/member-properties.md [Props](../configuration/member-properties.md) ../../configuration/member-properties/
appendices/validations.md logic-builder/index.md [LB](../logic-builder/index.md) ../../logic-builder/
administration/index.md administration/services.md [Services](services.md) services/
administration/index.md administration/migration.md#monitor [Monitor](migration.md#monitor) migration/#monitor

When in Doubt, Use Markdown Links

Markdown links ([text](path.md)) are handled by MkDocs and are more reliable across different configurations. Use HTML <a href> links only when you need them for card layouts, buttons, or other HTML structures. When you must use HTML links, always verify them locally before pushing.