Forms Using GET: When Crawlable Form URLs Become an SEO Problem
- May 25, 2025
- Indexation, Forms

method="get". GET submissions append their fields to the URL as query strings, and Google can and does discover, crawl, and sometimes index those parameter URLs. On a filter or search form that means thousands of near-duplicate URLs eating crawl budget. The fix is to control which parameter URLs are crawlable, not to break the form.A form using GET puts every field the user submits into the URL: ?q=blue+widgets&sort=price. That is correct behavior for a search or filter box — the results should be linkable and bookmarkable. The problem is that crawlers treat those generated URLs as links. On a faceted product listing, a handful of filters combine into a combinatorial explosion of thin, near-identical URLs. The stakes: wasted crawl budget on junk permutations and duplicate-content dilution, while your real pages wait in line.
A real example: the markup that spawns the URLs
Here is a typical filter form. It looks harmless. It is a crawl-budget faucet.
<form action="/shop/shoes/" method="get"> <select name="color"> <option>black</option> <option>red</option> </select> <select name="size"> <option>9</option> <option>10</option> </select> <select name="sort"> <option>price</option> <option>new</option> </select> <button type="submit">Filter</button> </form> Generated URLs Googlebot can discover: /shop/shoes/?color=black&size=9&sort=price /shop/shoes/?color=red&size=10&sort=new /shop/shoes/?sort=new&color=black&size=9 ← same content, different order ...every combination, in every order = hundreds of near-dupes
Note the third URL: the same three filters in a different order produce a different URL string but identical content. Multiply that across colors, sizes, sort orders and price bands and one form quietly generates hundreds of crawlable duplicates of a single listing page.
The fix in one move: point a self-referencing or clean canonical from every parameter variant back to the un-filtered listing (or the one true version of that result), and add descriptive rules so crawlers know these are filters, not fresh pages. The form keeps working for users; Google stops treating each permutation as a page worth indexing.
GET vs. POST for forms: what changes for SEO
| Aspect | method="get" | method="post" |
|---|---|---|
| Data goes where? | Into the URL as ?key=value | Into the request body, not the URL |
| Crawlable / linkable? | Yes — every submission is a URL | No — Googlebot does not submit POST forms |
| Crawl-budget risk | High on filters/search | Effectively none |
| Right choice for | Results you want shareable (search, one key filter) | Logins, checkout, anything not meant to be a page |
GET is not wrong. A blog search box that produces one clean ?s=keyword URL is fine. The danger is multi-field filter forms where GET manufactures a combinatorial mess. If you are wrestling with the resulting URLs, the deeper playbook is in our faceted navigation guide.
How to detect it
- Crawl and look at your parameter URL count. In Screaming Frog, after a crawl go to the URL tab and filter for
?. A big pile of parameter URLs relative to your real page count is the tell. Configuration → Spider → Crawl "URL fragments" and parameters to see how deep it goes. - Grep the source for GET forms. Search your crawl's HTML export (or
curl -sa template page) formethod="get"andmethod=get. Note which forms are search/filter versus harmless single-field boxes. - Check GSC's Page indexing report. Look for "Duplicate without user-selected canonical" or "Alternate page with proper canonical tag" swelling with parameter URLs, and watch the Crawl Stats report for a rising share of requests hitting
?URLs. - Sample the duplicates by curl. Fetch two different parameter orderings of the same filter and diff the response bodies. Identical content on different URLs confirms the duplication.
How to fix it
- Canonicalize the variants. Every parameter permutation should carry a
rel="canonical"pointing to the clean, un-parameterized version of that page. This is the primary defense against the duplicate-content half of the problem. - Decide crawl policy per parameter. Filters that create no unique indexable value (sort order, session, tracking) should be discouraged from crawling; a single meaningful filter you want ranked can stay crawlable. Our URL parameter handling guide walks the block-vs-canonicalize-vs-crawl decision.
- Block the truly worthless permutations in robots.txt only when you are certain those URLs hold nothing you need indexed — and remember robots.txt stops crawling, not indexing of already-known URLs.
- Consider POST for non-shareable forms. If a form's results were never meant to be a landing page (internal tools, multi-step configurators), switch it to
method="post"so no URLs are generated at all. - Keep parameter order consistent. Have the app emit filters in a fixed order so
color-then-sizenever also appears assize-then-color, halving the duplicate surface for free. - Re-crawl and watch the numbers. Parameter URL count and duplicate warnings should fall over the following weeks as Google reprocesses.
FAQ
Should I just change every GET form to POST?
No. GET is the correct method whenever the result should be a shareable, bookmarkable, linkable URL — a site search, a single-facet category filter. Blanket-switching to POST breaks that and hides genuinely useful pages from search entirely. Only switch forms whose output was never meant to be indexed.
Does method="get" hurt rankings by itself?
The attribute alone does nothing. The harm comes from what it produces at scale: thin, duplicate parameter URLs that split signals and burn crawl budget. On a small site with one simple search box, it is a non-issue. On a large faceted catalog, it is one of the biggest crawl-waste sources there is.
Will robots.txt alone fix it?
Not cleanly. Robots.txt stops Google from crawling the URLs, but URLs already discovered can still show up indexed with no snippet, and blocked pages cannot pass or consolidate signals via canonical. Canonicalization is usually the better first tool; use robots.txt for parameter classes that are pure noise.
What about the crawl budget cost — is it real for a small site?
For a few hundred pages, Google will happily crawl your junk URLs and the waste is invisible. Crawl budget only becomes a real constraint on large sites, but the duplicate-content risk from parameter permutations applies at any size. See our crawl budget explainer for when to actually worry.
How do I stop the same filters in different orders creating different URLs?
Fix it at the source: have your application serialize parameters in a fixed, canonical order before building the URL, and set a self-referencing canonical to that ordered form. That collapses every ordering of the same filter set onto one URL.
Related reading: URL parameter handling for SEO · Faceted navigation guide · URL parameters (definition) · URL has tracking parameters
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







