At dchost.com we see the same pattern over and over: a website grows, the content team wants cleaner URLs, the dev team wants a new framework, or the marketing team wants to re‑organise categories. Technically it is just a few rewrite rules, but from Google’s perspective you are reshuffling the entire map of your site. Done carefully, you keep rankings and even gain performance; done carelessly, you ship weeks of 404s, duplicate pages and lost organic traffic.
This article focuses on the practical middle ground: how to change URL structures in a way that is safe for SEO, using clean 301 redirects on both Apache (.htaccess) and Nginx. We will look at the SEO rules that really matter, the most common redirect patterns (HTTP→HTTPS, non‑www→www, trailing slash, moved folders, removed file extensions), and how to translate them into working configuration examples. We will also cover how to test, debug and clean up once your changes go live, so you can evolve your URL structure without fearing a ranking crash.
İçindekiler
- 1 Why URL Structure Changes Matter for SEO
- 2 Planning an SEO‑Safe URL Migration
- 3 301 Redirect Patterns in Apache .htaccess
- 3.1 Basic one‑to‑one 301 redirect
- 3.2 HTTP to HTTPS redirect (global)
- 3.3 Non‑www to www (or the reverse)
- 3.4 Combining HTTPS and host canonicalisation
- 3.5 Removing or adding a trailing slash
- 3.6 Moving a whole folder (category change)
- 3.7 Removing file extensions (.php, .html)
- 3.8 Handling query strings safely
- 3.9 When to use 410 (Gone) instead of 301
- 4 301 Redirect Patterns in Nginx
- 5 Testing, Monitoring and Cleaning Up After the Change
- 6 Wrapping Up: Practical Checklist and Next Steps
Why URL Structure Changes Matter for SEO
Search engines don’t care about your specific folder names, but they care a lot about consistency, crawlability and signals. When you change URL structures, you are changing the primary keys of your content in Google’s index. That can be positive or negative depending on how you handle redirects and internal links.
From an SEO and hosting perspective, three things matter most:
- Correct status codes: Use 301 (permanent) when a URL has a new home, 302 only for temporary moves, and 404/410 when content is truly gone. If you need a refresher, we explain this in detail in our guide on what HTTP status codes mean for SEO and hosting.
- Avoiding redirect chains and loops: Multiple hops slow users down and dilute signals. Google will follow some redirects, but you don’t want /old → /older → /newest if you can go /old → /new directly.
- Maintaining one canonical URL per piece of content: www vs non‑www, HTTP vs HTTPS, trailing slash vs no trailing slash – every ambiguity must be normalised.
When you build your redirects with those principles in mind, structure changes become a low‑risk, routine operation instead of a stressful “don’t touch anything” moment.
Planning an SEO‑Safe URL Migration
Before we touch .htaccess or Nginx, we need a plan. Most SEO damage does not come from the syntax of redirect rules, but from missing or incomplete mapping.
Step 1: Inventory your current URLs
Export as many existing URLs as you can:
- From your CMS (posts, pages, categories, products)
- From your web server logs (high‑traffic URLs over the last 6–12 months)
- From tools like Search Console and crawlers
Prioritise URLs that already receive organic traffic or backlinks. These deserve pixel‑perfect 301 mappings.
Step 2: Define the new structure and mapping table
Create a spreadsheet with at least two columns:
- Old URL path (e.g. /blog/2022/09/seo-tips.html)
- New URL path (e.g. /blog/seo-tips/)
Whenever possible, use predictable patterns instead of one‑off rules. For example, if all your blog posts will move from /blog/YYYY/MM/slug/ to /blog/slug/, you can cover hundreds of URLs with a single regex redirect – we will show examples for both Apache and Nginx.
Step 3: Decide on your canonical rules
Decide once and apply everywhere:
- Will you use www or bare domain as canonical?
- Will directories end with or without trailing slash?
- Will you show file extensions in URLs (.php, .html) or hide them?
- Are you enforcing HTTPS everywhere?
Once you decide, your redirect configuration should funnel every variant into a single canonical version (for example, http://example.com/blog to https://www.example.com/blog/).
Step 4: Test on staging if you can
If your hosting setup includes dev or staging environments (for example on a separate VPS or subdomain), deploy your URL changes there first. That is the safest way to catch redirect loops and broken patterns before they affect real users. If you do not yet have a multi‑environment workflow, our article on hosting architecture for dev, staging and production environments is a good place to start.
301 Redirect Patterns in Apache .htaccess
On shared hosting and many cPanel setups, Apache’s .htaccess file is where most URL rewriting happens. The rules live inside your web root (often public_html). Below are commonly used, SEO‑safe patterns.
Basic one‑to‑one 301 redirect
For a small number of changed URLs, keep it explicit and readable.
RewriteEngine On
# Old article to new article
Redirect 301 /blog/2022/09/seo-tips.html /blog/seo-tips/
# Old product to new product
Redirect 301 /shop/product-123.html /store/new-product-slug/
Notes:
- Use relative paths; Apache will prepend your domain automatically.
- Place specific Redirect lines before generic regex rules to avoid conflicts.
HTTP to HTTPS redirect (global)
If you are migrating to HTTPS (and you should), you want a single 301 from every HTTP URL to its HTTPS twin. For the hosting side of a full certificate move, we have a detailed walkthrough in our full HTTPS migration guide with 301 redirects, HSTS and SEO safeguards. The core .htaccess rule looks like this:
RewriteEngine On
# Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
This preserves the host (www or non‑www) and the path/query untouched, only changing the scheme to https://.
Non‑www to www (or the reverse)
Pick one as canonical. Example: redirect non‑www to www.
RewriteEngine On
# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
To go the other way (www → non‑www), invert the condition and target host:
RewriteEngine On
# Redirect www.example.com to example.com
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [L,R=301]
Combining HTTPS and host canonicalisation
To keep things simple and avoid extra hops, combine HTTPS and host rules into a single redirect, sending everything straight to your chosen canonical form:
RewriteEngine On
# Force HTTPS and www together
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
This means http://example.com/page, http://www.example.com/page and https://example.com/page all become https://www.example.com/page in one hop.
Removing or adding a trailing slash
Again, choose one canonical style. Example: enforce trailing slash on directory‑like URLs, but keep extensions unchanged.
RewriteEngine On
# Add trailing slash if missing and no file extension
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.[a-zA-Z0-9]{2,6}$
RewriteRule ^(.+[^/])$ /$1/ [L,R=301]
To remove trailing slashes instead, flip the logic:
RewriteEngine On
# Remove trailing slash from non-root URLs
RewriteCond %{REQUEST_URI} .+/$
RewriteRule ^(.+)/$ /$1 [L,R=301]
Moving a whole folder (category change)
Suppose /blog/ is being renamed to /articles/ and all posts keep the same slug.
RewriteEngine On
# Move /blog/slug/ to /articles/slug/
RewriteRule ^blog/(.*)$ /articles/$1 [L,R=301]
This pattern is powerful. Be sure there is no overlap with other rules, and that /articles/ is fully ready to serve equivalent content.
Removing file extensions (.php, .html)
Hiding file extensions is common when modernising old PHP sites. Here’s a two‑part approach:
- Rewrite extension‑less URL to internal PHP script (no redirect).
- Redirect old .php URLs to the extension‑less version (301).
RewriteEngine On
# Internally serve /page from /page.php if it exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]
# Redirect /page.php to /page
RewriteRule ^(.+).php$ /$1 [L,R=301]
This way users and search engines end up on /page, but your application still uses page.php behind the scenes.
Handling query strings safely
By default, Apache keeps the query string when you use Redirect or RewriteRule unless you explicitly change it. Example: redirect an old UTM‑heavy campaign URL to a clean landing page.
# Redirect specific campaign URL ignoring its query string
RewriteCond %{QUERY_STRING} (^|&)utm_campaign=old-promo(&|$)
RewriteRule ^landing.php$ /new-landing/ [L,R=301,QSD]
The QSD flag (Query String Discard) drops the query string so /new-landing/ is clean.
When to use 410 (Gone) instead of 301
Some URLs should simply die: outdated campaigns, thin content you intentionally removed, or spammy old pages. In those rare cases you can explicitly say the content is gone:
# URL permanently removed, no replacement
Redirect 410 /old-section/bad-content.html
For more on deciding between 404, 410 and 301, again see our article on HTTP status codes and their SEO impact.
301 Redirect Patterns in Nginx
On VPS, dedicated servers and many high‑traffic WordPress or Laravel stacks, Nginx often sits in front (sometimes with PHP‑FPM or as a reverse proxy). Nginx does not use .htaccess; configuration lives in server blocks (typically under /etc/nginx/sites-available/). Changes require a reload, but performance and clarity are better.
Basics: return vs rewrite
- return 301 … is preferred for simple, one‑to‑one redirects and canonical rules: it is fast and easy to reason about.
- rewrite … is useful when you need regex captures and more advanced logic, but should be used carefully.
HTTP to HTTPS redirect server
Common pattern: one server block for HTTP that only redirects, and another for HTTPS that serves content.
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
This is the Nginx equivalent of the .htaccess HTTPS rule, but more efficient.
Non‑www to www (or reverse) on Nginx
Example: enforce www.
# Redirect non-www to www
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
# Main www virtual host
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.com;
# SSL config, root, etc...
}
To enforce non‑www, swap the hostnames.
Folder move with regex
Move everything from /blog/ to /articles/ while preserving the rest of the path.
server {
# ...
location ~* ^/blog/(.*)$ {
return 301 /articles/$1;
}
# other locations...
}
Because we are using return 301 with a captured group, the redirect is both fast and easy for crawlers to follow.
Adding or removing trailing slash
Example: enforce trailing slash, but leave files untouched.
server {
# ...
# Add trailing slash for paths without extension
location ~ ^(.+[^/])$ {
if ($request_uri ~* ".[a-z0-9]{2,6}$") {
break; # has extension, do nothing
}
return 301 $1/;
}
}
If you prefer to remove the trailing slash:
server {
# ...
# Remove trailing slash from non-root URLs
location ~ ^(.+)/$ {
return 301 $1;
}
}
Be careful not to conflict with application‑level routing (e.g. frameworks that already normalise slashes). Always test these on staging first.
Removing .php extension in Nginx
As with Apache, we want users to see /about while PHP executes about.php internally.
server {
listen 443 ssl http2;
server_name www.example.com;
root /var/www/html;
# Redirect /page.php to /page
location ~ ^/(.+).php$ {
return 301 /$1;
}
# Try to serve /page as /page.php
location / {
try_files $uri $uri/ $uri.php =404;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
The try_files directive handles internal rewrites without changing the URL in the browser.
Redirecting individual pages (clean syntax)
For small sets of changed URLs where you do not need regex, keep it readable with exact locations:
server {
# ...
location = /blog/2022/09/seo-tips.html {
return 301 /blog/seo-tips/;
}
location = /shop/product-123.html {
return 301 /store/new-product-slug/;
}
}
location = matches the path exactly, so there is no ambiguity.
Handling query strings in Nginx redirects
Nginx keeps the query string automatically when you use $request_uri. If you want to strip it, just omit it from your target.
# Preserve query string (default)
return 301 https://www.example.com$request_uri;
# Drop query string entirely
return 301 https://www.example.com/clean-landing/;
To match specific query parameters, you can use if ($arg_...) carefully:
if ($arg_utm_campaign = "old-promo") {
return 301 /new-landing/;
}
Nginx if has caveats when used inside location, so keep logic simple and test thoroughly.
Testing, Monitoring and Cleaning Up After the Change
Writing redirect rules is only half of the job. The rest is proving they behave as intended and updating all the surrounding SEO signals.
How to test your redirects
- Browser tests: Manually hit your top 20–50 old URLs, watch the address bar and status codes (use developer tools > Network).
- Command line: Use curl to see the exact response chain:
curl -I -L http://example.com/old-url/ - Crawler: Run a small crawl (hundreds or thousands of URLs) to check for 404s, redirect loops and long chains.
Fix any 302s where you meant 301, and collapse chains (A→B→C) into a single hop (A→C) whenever you can.
Update internal links, canonicals and sitemaps
Redirects are a safety net, not a permanent crutch. Once your new structure is live:
- Update internal links in menus, body content and footers to use the new URLs directly.
- Ensure rel=”canonical” tags point to the canonical version (HTTPS, www/non‑www, trailing slash policy).
- Refresh your XML sitemaps with only the new URLs. We explain this step‑by‑step in our guide to setting up robots.txt and sitemap.xml correctly for SEO and hosting.
If you are also consolidating multiple domains (for example redirecting regional domains into one main site), coordinate your redirect rules with canonical tags and Hreflang. Our article on pointing multiple domains to one website with 301 redirects and canonical tags dives into those patterns.
Watch logs and Search Console
After deployment, your server logs are your best friend:
- Filter for 404 responses and see which paths are still being requested. Decide whether each should get a 301 to an equivalent page or remain a 404/410.
- Monitor 5xx errors (500, 502, 504) that might indicate misconfiguration or loops.
In Google Search Console, expect a short‑term spike in “Moved” and “Found” statuses as Google recrawls. Over a few weeks, old URLs should be gradually replaced by the new ones in index coverage and performance reports.
Special case: changing domain names
If you are not just reshaping paths, but moving from one domain to another, the redirect rules are similar but the stakes are higher. You will want:
- A global 301 from every old‑domain URL to the matching new‑domain URL.
- Updated DNS, SSL certificates and email/DNS records.
- Change of Address in Google Search Console.
We have a dedicated walkthrough on how to change your domain without losing SEO, including hosting‑side and DNS considerations.
Wrapping Up: Practical Checklist and Next Steps
URL structure changes do not have to be scary. With a clear mapping of old to new paths, a handful of well‑tested 301 redirect patterns in .htaccess or Nginx, and a bit of log watching, you can evolve your site architecture without sacrificing hard‑earned rankings. The key is to treat every existing URL as an asset: either give it a clean new home with a 301, or consciously retire it with a 404/410 instead of letting it break.
From the hosting side, this is exactly the kind of work where a solid foundation helps. On shared hosting, that means .htaccess rules that are simple and predictable; on VPS, dedicated or colocation servers it means version‑controlled Nginx or Apache configs and a safe deployment workflow. If you are planning a larger redesign, replatform or domain change, combining the redirect patterns in this article with our new website launch checklist for hosting‑side SEO and performance will give you a calm, step‑by‑step plan.
And if you prefer not to worry about the low‑level details, our team at dchost.com can help you choose the right hosting stack – from classic shared hosting to VPS, dedicated servers or colocation – and configure redirects, SSL and DNS in a way that keeps both users and search engines happy.
