Redirect TrailTrail Signs for moved web pages Trail Pass $1.95/moFree during preview

Map Maker

Every old address, sent to its new home

Paste the old addresses, one per line. Put the new address on the same line when you know it (a space, tab, comma or -> between them). Nothing is stored unless you save it.

Free maps hold 50 rules and test one address at a time. Trail Pass ($1.95 a month or $19.50 a year) holds 2,000 rules per map, tests 50 addresses at once and adds CSV and file downloads. Free during preview: every Trail Pass feature is on for everyone. Pricing

This is the worked example (a campground site). Start with an empty map.

How addresses match

Campground site rebuild: trail report

Rules written
6
Stopped
3
Look at this
2
Good to know
1
Without a target
2

Site: campground.example.com (with or without www.)

Findings

  • C1Good to know: Line 2: /our-cabins.html → /stay/cabins → /cabins was a chain of 2 hops. Written as one: /our-cabins.html → /cabins. why
  • C7Look at this: Line 4: /rates.php?id=12 matches only that exact query (id=12). Other queries on /rates.php are not moved by this rule. why
  • C6Look at this: Case twins: /contact.html (line 5) and /Contact.html (line 6) differ only in capital letters. Servers treat them as different addresses; each needs its own rule (they have one), or tick "ignore letter case". why
  • C3Stopped: Line 9: /gallery.html points at itself. A server would send visitors round in a circle. Left out. why
  • C2Stopped: Line 10: /specials.html leads into a loop (/specials.html → /specials-2026.html → back again). Left out; fix one of those lines. why
  • C2Stopped: Line 11: /specials-2026.html leads into a loop (/specials-2026.html → /specials.html → back again). Left out; fix one of those lines. why

Rules (6)

LineOld addressNew address
4 /rates.php?id=12 301 → /stay/rates/group
1 /about-us.html 301 → /about
2 /our-cabins.html 301 → /cabinswas via /stay/cabins
3 /stay/cabins 301 → /cabins
5 /contact.html 301 → /contact
6 /Contact.html 301 → /contact

Old addresses without a target

  • line 7 /news/2019/new-bathhouse.html suggested by same page name → /news/new-bathhouse
  • line 8 /reserve-online.html suggested by closest words → /reserve

writes them into the old-address box as pairs and makes the map again; check each one.

The signs: copy into your server

# Redirect map from hillbillyhosting.org (Trail Signs). 6 rule(s), 301 = moved for good.
# Put these lines in the .htaccess file of your site's top folder, ABOVE any CMS block (for example "# BEGIN WordPress").
# Needs Apache 2.4 with mod_rewrite. Each rule matches one exact address (not everything under it).
<IfModule mod_rewrite.c>
RewriteEngine On
# line 4: /rates.php?id=12 -> /stay/rates/group
RewriteCond %{QUERY_STRING} ^id=12$
RewriteRule ^rates\.php/?$ /stay/rates/group [R=301,L,NE,QSD]
# line 1: /about-us.html -> /about
RewriteRule ^about-us\.html/?$ /about [R=301,L,NE]
# line 2: /our-cabins.html -> /cabins
RewriteRule ^our-cabins\.html/?$ /cabins [R=301,L,NE]
# line 3: /stay/cabins -> /cabins
RewriteRule ^stay/cabins/?$ /cabins [R=301,L,NE]
# line 5: /contact.html -> /contact
RewriteRule ^contact\.html/?$ /contact [R=301,L,NE]
# line 6: /Contact.html -> /contact
RewriteRule ^Contact\.html/?$ /contact [R=301,L,NE]
</IfModule>
# Redirect map from hillbillyhosting.org (Trail Signs). 6 rule(s), 301 = moved for good.
# Paste inside the server { } block of your site, then run: nginx -t && nginx -s reload
# If a location below already exists in your config, keep one of them (nginx refuses duplicates).
# line 4
if ($request_uri = "/rates.php?id=12") { return 301 "/stay/rates/group"; }
# line 1
location = "/about-us.html" { return 301 "/about$is_args$args"; }
location = "/about-us.html/" { return 301 "/about$is_args$args"; }
# line 2
location = "/our-cabins.html" { return 301 "/cabins$is_args$args"; }
location = "/our-cabins.html/" { return 301 "/cabins$is_args$args"; }
# line 3
location = "/stay/cabins" { return 301 "/cabins$is_args$args"; }
location = "/stay/cabins/" { return 301 "/cabins$is_args$args"; }
# line 5
location = "/contact.html" { return 301 "/contact$is_args$args"; }
location = "/contact.html/" { return 301 "/contact$is_args$args"; }
# line 6
location = "/Contact.html" { return 301 "/contact$is_args$args"; }
location = "/Contact.html/" { return 301 "/contact$is_args$args"; }
/rates.php?id=12 -> /stay/rates/group
/about-us.html -> /about
/our-cabins.html -> /cabins
/stay/cabins -> /cabins
/contact.html -> /contact
/Contact.html -> /contact
Download as a file (Trail Pass): Free during preview.

Test pad

Type an old address (up to 50, one per line). The answer comes from the same rules shown above.

Keep this map

Saves the boxes and options to your Trail Book: a private link, no account, no email. Free Trail Books keep 1 map; Trail Pass keeps 25.