URLs that look the same to a person are different strings to every tool: with and without a trailing slash, HTTP and HTTPS, with tracking parameters, or with full paths when you only need the domain. Before you can compare crawls, map redirects, deduplicate backlinks or summarise linking domains, URL lists need to be normalised.
This guide covers SeoWolf's URL tools β trailing slashes, HTTP to HTTPS, query strings, domains, URL extraction and slug generation β with the pitfalls and real workflows for each.
The Tools at a Glance
| Tool | Use it to |
|---|---|
| Add Trailing Slash to URLs | A trailing slash is one character, and it is the difference between two URLs that most systems treat as entirely separate addresses. |
| Remove Trailing Slash from URLs | This strips a final / from URLs that have one, leaving those without unchanged. |
| Convert HTTP to HTTPS | This rewrites the scheme at the front of every URL in a list from http:// to https://, leaving the rest of each address untouched. |
| Strip Query Strings from URLs | This removes everything from the ? onward, leaving the base URL. |
| Strip URL Path (Keep Domain Only) | This discards everything after the host, leaving the bare domain. |
| Extract Domain from URLs | This reduces each URL to its domain, discarding the path, query string and scheme. |
| Extract URLs from Text | URLs rarely arrive as a tidy list. |
| Generate URL Slugs | A slug is the part of a URL identifying a specific page. |
Add Trailing Slash to URLs
What It Does
A trailing slash is one character, and it is the difference between two URLs that most systems treat as entirely separate addresses. Normalising a list so every URL ends the same way removes an entire category of confusion.
Why the slash is not cosmetic
/about and /about/ can serve the same page, redirect to one another, or serve two different pages. Which of those is true depends on server configuration. What is always true is that analytics, crawlers and redirect maps treat them as distinct strings.
What the tool does
It adds a trailing slash to every line that does not already have one, and leaves the ones that do alone. That second half matters β a blind append produces /about//, which is a third distinct URL.
When to normalise
Before comparing two lists, before building a redirect map, and before deduplicating. Comparing un-normalised URL lists produces false differences that cost real time to chase down.
Trailing Slash Rules Have More Edge Cases Than You Think
The naive rule β if the line does not end in /, append one β is wrong for several common URL shapes, and each wrong case produces a URL that looks fine and resolves to nothing.
Do not slash a file
/downloads/report.pdf/ is not the PDF. Any URL whose final path segment contains a dot is probably a file, and appending a slash to it produces a 404. The rule needs to skip those.
Query strings and fragments are not the path
The slash belongs at the end of the path, not the end of the string. /search?q=shoes must become /search/?q=shoes, never /search?q=shoes/ β the second appends a slash to the value of q, silently changing the query. Same for #anchor.
The root is already correct
https://example.com normalises to https://example.com/, and that one is genuinely just an append. But a rule that treats the whole URL as an opaque string cannot tell that case apart from the three above.
Why pick the tool over the regex
A correct implementation parses the URL, modifies the path component, and reassembles it. That is a real piece of code, not a one-liner, and it is worth not rewriting it under time pressure.
In a Real Workflow: Why Your Two URL Lists Disagree by 200 Rows
You export the pages your crawler found and the pages your analytics recorded, compare them, and get a difference of two hundred URLs. Before investigating any of them, check whether you are comparing like with like.
The most common false positive
One system records /pricing and the other records /pricing/. As strings these do not match, so every affected page appears in the difference β reported as a crawlable page with no traffic, or traffic to a page the crawler never found. Both readings are wrong.
Normalise first, then compare
Put both lists through the same trailing-slash rule before comparing them. The differences that survive are real ones worth investigating, and there are usually far fewer than the raw comparison suggested.
The time this actually saves
The cost of skipping this is not the five minutes of normalising. It is the afternoon spent investigating two hundred phantom orphan pages, and the credibility lost when the finding turns out to be a formatting artefact.
Try it: Add Trailing Slash to URLs on SeoWolf's Notepad.
Remove Trailing Slash from URLs
What It Does
This strips a final / from URLs that have one, leaving those without unchanged.
The normalisation question
Whether URLs should end with a slash is a convention, and either answer works. What breaks things is a list containing both forms, because they compare as different strings.
Why you might strip rather than add
If the destination system, the analytics platform or the existing convention uses no trailing slash, matching that avoids a mismatch at every comparison.
Never strip the root
https://example.com/ reduced to https://example.com is a different and less correct form. The root slash is part of the address.
Stripping a Trailing Slash Without Breaking the Root
sed 's|/$||' removes a final slash and gets the root case wrong. Several other cases need care too.
The root must keep its slash
https://example.com/ becomes https://example.com, which is a valid host but no longer a complete URL with a path. Any rule operating on the whole string cannot distinguish this from a normal path ending in a slash β the check has to know where the path begins.
Query strings and fragments come after the path
/page/?a=1 does not end in a slash, so a string-level rule misses it entirely while a path-level rule handles it correctly. The slash to remove is the last character of the path component, not of the string.
Directory versus file semantics
On some servers /docs and /docs/ resolve differently, with the second treated as a directory index. Normalising the recorded URL does not change what the server does, so verify the chosen form actually returns 200 rather than a redirect before standardising a whole dataset on it.
Parse, modify, reassemble
As with every URL operation, the reliable approach is to parse the URL, change the path component, and rebuild. String manipulation handles the common case and quietly mangles the rest.
In a Real Workflow: Picking a URL Convention and Enforcing It Once
Trailing slash or no trailing slash does not affect rankings. Serving both without redirecting between them does, because it splits the same page into two addresses.
What splitting costs
Links arriving at both forms divide the signals that should accumulate on one. Analytics reports the page twice. Any report comparing crawl data against traffic data shows false mismatches.
Decide, then redirect
Pick either convention and 301 the other form to it, site-wide. Which you pick genuinely does not matter; having both return 200 does.
Normalise historical data too
Existing exports, redirect maps and tracking configurations will contain the old mixture. Normalising them to the chosen form is what makes past and future data comparable, and it is the step most people skip after fixing the live site.
Try it: Remove Trailing Slash from URLs on SeoWolf's Notepad.
Convert HTTP to HTTPS
What It Does
This rewrites the scheme at the front of every URL in a list from http:// to https://, leaving the rest of each address untouched.
Why lists still contain HTTP
Old backlink exports, citation records, directory listings and archived documents were written when HTTP was normal. The sites have since moved to HTTPS, but the recorded URLs did not update themselves.
What the conversion is for
Comparing an old list against a current one requires both to use the same scheme, or every row appears to differ. Converting first removes that false difference.
One caution
Converting the string does not make the target work. It assumes the destination genuinely serves HTTPS, which is worth confirming for older or abandoned domains.
Rewriting URL Schemes Without Corrupting the Path
sed 's|^http://|https://|' is the correct form, and the anchor is the important part.
Without the anchor you corrupt data
An unanchored s|http://|https://|g also rewrites URLs that appear inside other URLs β redirect trackers and archive links routinely embed a full target URL as a parameter. Rewriting that embedded value changes where the link points, and the result still looks like a valid URL, so nothing flags it.
Protocol-relative URLs are a separate case
//example.com/page inherits the scheme of the page it sits on. It is neither HTTP nor HTTPS in the string, so a scheme rewrite skips it entirely. If a list mixes these in, handle them as their own branch rather than assuming the rewrite covered everything.
The rewrite is a string operation, not a migration
Changing a recorded URL says nothing about whether the server answers on 443. Where it matters, follow up with a request that reports the final status and destination β a list of HTTPS strings pointing at hosts that only serve HTTP is worse than the original, because it now looks correct.
In a Real Workflow: Rescuing an Old Backlink List After a Site Moved to HTTPS
A client hands over a backlink report from 2019. Six hundred referring URLs, all recorded as HTTP. The site migrated to HTTPS two years ago, and now nobody can tell which of those links still exist.
Normalise before comparing
Convert the old list to HTTPS and compare it against a current backlink export. Matching rows are links that survived. Rows only in the old list are candidates for lost links β and now it is a real list rather than six hundred unknowns.
Do not skip the verification
Some of those links are genuinely gone; others merely moved. Check a sample of the apparent losses directly before reporting a number, because a redirect chain can make a live link look dead in an export.
What to do with real losses
Losing a link from a site that still exists is usually worth an email. Losing one from a site that has since closed is not recoverable, and separating those two piles saves outreach effort that would otherwise go nowhere.
Try it: Convert HTTP to HTTPS on SeoWolf's Notepad.
Strip Query Strings from URLs
What It Does
This removes everything from the ? onward, leaving the base URL. /products?colour=red&size=9 becomes /products.
Why remove them
Query parameters usually identify a variation of a page rather than a different page. For counting how many distinct pages exist, the parameters are noise.
The immediate effect
A URL list heavy with tracking and filter parameters collapses dramatically. Ten thousand rows frequently become a few hundred genuine pages.
When to keep them
Some parameters do define distinct content β a product ID, a page number, a search term. Strip parameters when they are tracking or filtering, and keep them when they select what the page shows.
Fragments, Encoded Question Marks, and Other Query Traps
sed 's/?.*//' truncates at the first ?. That is correct for most URLs and wrong for a few in ways worth knowing.
The fragment comes after the query
/page?a=1#section truncates to /page, taking the fragment with it. Usually fine, since fragments are client-side only β but if the site uses fragment routing, the fragment was the page identity and you have just discarded it.
Encoded question marks inside parameters
A parameter value containing an encoded ? is safe, because the encoded form is %3F. A raw ? in a value is technically permitted after the first one, so truncating at the first ? is correct while truncating at the last is not.
Parameter order makes duplicates
?a=1&b=2 and ?b=2&a=1 are the same page and different strings. If you are keeping parameters rather than stripping them, sort them before deduplicating or the same page counts twice.
Prefer a URL parser
Every language has one. It handles the component boundaries correctly, and reassembling from parsed components is safer than pattern-matching the string.
In a Real Workflow: Finding Out How Many Pages Your Site Actually Has
Ask three systems how many pages a site has and get three answers. The analytics platform says 40,000, the crawler says 12,000, the CMS says 900. All three are counting different things.
Parameters explain most of the gap
Analytics counts every distinct URL that received a visit, including every tracking parameter combination. Strip the query strings, deduplicate, and the number collapses toward something recognisable.
The reconciliation is the finding
If 900 CMS pages generate 40,000 tracked URLs, that is a measurement problem worth fixing in the analytics configuration, and possibly an indexing problem worth fixing on the site.
Before you strip, check what you lose
Paginated URLs and genuine search or filter pages sometimes deserve to be counted separately. Look at the most common parameters first and decide which define content, then strip only the rest.
Try it: Strip Query Strings from URLs on SeoWolf's Notepad.
Strip URL Path (Keep Domain Only)
What It Does
This discards everything after the host, leaving the bare domain. https://example.com/blog/post becomes example.com.
Changing what you are counting
Page-level data answers questions about pages. Domain-level data answers questions about sites. Stripping the path converts one into the other.
Where it is used
Backlink analysis, referral traffic review, competitor identification β all of which are questions about which sites are involved rather than which pages.
Deduplicate afterwards
Stripping paths creates many identical rows. The distinct count after deduplication is the number of sites involved, which is usually the figure that matters.
Host, Origin, and Registrable Domain Are Three Things
Stripping a path sounds like one operation but the result depends on which of several similar concepts you actually want.
The three levels
https://blog.example.co.uk:8443/post has an origin of https://blog.example.co.uk:8443, a host of blog.example.co.uk, and a registrable domain of example.co.uk. Aggregating by the wrong one produces either fragmented or over-merged results.
Subdomains are a judgement call
blog.example.com and shop.example.com are one organisation and two hosts. For backlink analysis they usually count as one referring domain; for traffic attribution they may need separating. Decide deliberately, because the counts differ substantially.
www is a subdomain
www.example.com and example.com are technically different hosts and almost always the same site. Normalising www away is nearly always correct and is the single most common cause of inflated domain counts.
Use a Public Suffix List library
Reducing to a registrable domain cannot be done by counting dots β example.co.uk needs three labels while example.com needs two. Only the Public Suffix List knows which.
In a Real Workflow: Which Sites Actually Send You Traffic
A referral report lists two thousand URLs. It looks like broad reach and usually is not β most of those URLs come from a handful of domains.
Reducing to sites
Strip the paths and count occurrences per domain. Two thousand referring URLs frequently resolve to under a hundred sites, with the top five accounting for most of the traffic.
Concentration is the finding
If three domains send seventy per cent of referral traffic, those are relationships worth actively maintaining rather than treating as background. It also means the referral channel is fragile β losing one placement removes a large share of it.
Check the long tail before dismissing it
Domains sending small volumes sometimes convert far better than the high-volume ones, because the context is more relevant. Look at conversion rate per domain, not just sessions, before deciding where to invest.
Try it: Strip URL Path (Keep Domain Only) on SeoWolf's Notepad.
Extract Domain from URLs
What It Does
This reduces each URL to its domain, discarding the path, query string and scheme. https://example.com/blog/post?a=1 becomes example.com.
Changing the unit of analysis
A list of URLs answers questions about pages. A list of domains answers questions about sites. Backlink analysis, competitor research and referral traffic review are nearly always domain-level questions.
Deduplicate afterwards
Four hundred backlink URLs usually come from far fewer distinct sites. The count of unique domains is the number that matters for link profile assessment.
Counting occurrences is useful too
How many times each domain appears tells you which sites link to you repeatedly versus once, which is a meaningful distinction in link evaluation.
The Domain Is Not Just the Last Two Labels
Extracting a registrable domain by taking the final two dot-separated labels works for example.com and fails for a great many real hostnames.
Multi-part suffixes
example.co.uk has a registrable domain of example.co.uk, not co.uk. The same applies to com.au, co.jp and hundreds of others. There is no algorithmic rule for this β it requires the Public Suffix List, a maintained dataset of which suffixes are public registries.
Platform subdomains count as suffixes
github.io, blogspot.com and similar are on the Public Suffix List, so user.github.io is a registrable domain in its own right. Treating those as one site collapses thousands of independent sites into a single row.
Practical guidance
Use a library backed by the Public Suffix List rather than string splitting. If you must split manually, at minimum decide explicitly whether www is stripped and apply that consistently β www.example.com and example.com as separate rows is the most common cause of a referring-domain count that looks too high.
In a Real Workflow: Turning 4,000 Backlinks Into a Number You Can Report
A backlink export shows four thousand linking URLs. That figure sounds impressive and says almost nothing about link profile strength.
Reduce to referring domains
Extract domains and deduplicate. Four thousand links routinely collapse to two or three hundred referring domains β and referring domains is the metric that actually correlates with authority.
The distribution is the real story
If ten domains account for three thousand of the four thousand links, the profile is narrow and fragile. Losing one relationship removes a large share of it. A flatter distribution across many domains is more durable, even at a lower total.
What to do with the shape
A narrow profile means outreach should prioritise new domains over more links from existing ones. A flat profile with weak individual domains suggests the opposite. The raw link count supports neither conclusion.
Try it: Extract Domain from URLs on SeoWolf's Notepad.
Extract URLs from Text
What It Does
URLs rarely arrive as a tidy list. They are buried in email threads, pasted chat logs, HTML source, or documents where someone mentioned a dozen links in passing. Extraction pulls them out into a list you can act on.
What it scans for
The tool reads the whole block and returns every URL it finds, discarding the surrounding prose entirely.
Where the input usually comes from
A brief listing competitor pages, an outreach thread with links scattered through the replies, an exported page source, or a document where the links matter and the commentary does not.
What to do with the output
Deduplicate first β the same link is usually mentioned several times. Then extract domains if the question is about sites rather than pages.
There Is No Correct Regex for Matching URLs
Every URL-matching regex is a trade-off between catching valid addresses and rejecting invalid ones, and the specification is permissive enough that no single pattern gets both right.
Where the boundary is genuinely ambiguous
Read more at https://example.com/page. β is the final period part of the URL or the end of the sentence? Both are legal. Most implementations strip trailing punctuation, which is right almost always and wrong for the rare URL that legitimately ends in one.
Parentheses are worse. Wikipedia URLs contain balanced parentheses, so a link inside a parenthetical aside requires counting bracket depth to terminate correctly.
Practical extraction
Match a scheme, then consume until whitespace, then trim trailing .,;:!? and unbalanced closing brackets. That handles the overwhelming majority of real text.
Extracting from HTML is a different job
Do not regex HTML for links. Parse it and read href attributes. A regex cannot reliably tell an attribute from text that looks like one, and it will miss relative URLs entirely β which are usually the ones you actually wanted from a page's source.
In a Real Workflow: Turning a Messy Client Brief Into a Competitor List
The brief is four pages of prose. Somewhere inside it, across various paragraphs, the client has named eleven competitors and linked to about thirty specific pages they admire or want to beat. That is the actual input to your work.
Getting the links out
Paste the whole document and extract the URLs. Thirty links appear as a list in seconds, without reading the brief a second time hunting for anchors you missed.
Then reduce to domains
Strip each URL to its domain and deduplicate. Thirty page links usually collapse to eight or nine distinct competitors, which is the number that actually matters for the analysis.
Why the reduction is the useful part
A brief that mentions the same three domains repeatedly and one domain once is telling you something about priority that the raw link list obscures. Counting how often each domain appears turns an unstructured document into a ranked list of who the client is really worried about.
Try it: Extract URLs from Text on SeoWolf's Notepad.
Generate URL Slugs
What It Does
A slug is the part of a URL identifying a specific page. Generating one converts a human title into a form safe for an address: lowercase, hyphen-separated, no punctuation.
What the conversion does
Spaces become hyphens, punctuation is removed, accented characters are usually reduced to their unaccented equivalents, and everything is lowercased.
Why hyphens rather than underscores
Search engines treat hyphens as word separators and have historically been less consistent with underscores. Hyphens are the established convention for URLs.
Keep them short and stable
A slug should carry the distinguishing words and drop the filler. It should also stop changing β every change needs a redirect.
Slug Generation, Transliteration, and Collisions
Lowercase, replace non-alphanumerics with hyphens, collapse runs, trim the ends. That covers English. Everything else needs decisions.
Transliteration is language-specific
German ΓΌ transliterates to ue in German convention and u under a generic Unicode fold. Γ becomes ss. Getting this wrong produces slugs that native speakers read as misspelled. Normalising to NFD and stripping combining marks handles accents mechanically but applies no language knowledge.
Non-Latin scripts have no good default
Stripping non-ASCII from a Chinese or Arabic title leaves an empty slug. Options are percent-encoding the native text, which is valid and displays correctly in modern browsers, or requiring a manual slug. Silently producing an empty string is the one unacceptable outcome, and it is what naive implementations do.
Collisions need deterministic handling
Two different titles can generate the same slug. Append a numeric suffix, and make the check happen at generation time β discovering the collision at insert time, after a unique constraint fires, means handling it in an error path where the retry logic is usually wrong.
In a Real Workflow: Planning URLs Before the Content Gets Written
URLs are decided by whoever publishes the page, usually in the last minute before it goes live, usually by accepting whatever the CMS generated from the headline. That is how sites end up with addresses nobody would have chosen.
Decide them in the brief
Generating slugs from the planned titles at briefing time makes the URL a deliberate choice reviewed alongside everything else, rather than a side effect of a headline that changed three times during editing.
Trim the filler
An auto-generated slug from "10 Things You Need to Know About Choosing a CRM in 2026" is long and dated. choosing-a-crm says the same thing, survives next year's refresh, and reads better in a search result.
Leave the year out
Any slug containing a year forces a choice later between an outdated URL and a redirect. Put the year in the title where it can be edited freely, never in the address.
Try it: Generate URL Slugs on SeoWolf's Notepad.
The Bottom Line
Normalise URLs to one convention before comparing them, but never assume the variants are equivalent on the live site β a trailing-slash or HTTPS difference in a list may reflect a real redirect or duplicate-content issue worth fixing.
Next step: All of these tools are free in SeoWolf's Notepad β paste a list and transform it in your browser.