Lavi Avigdor
Lavi Avigdor

Reputation: 4182

How to remove trailing question mark from a GET form with no fields?

Example:

<form>
    <input type='submit'>
</form>

When submitted results in:

http://example.com/?

How to make it:

http://example.com/

?

[This is a very simple example of the problem, the actual form has many fields, but some are disabled at times. When all are disabled, the trailing ? appears]

Upvotes: 29

Views: 14329

Answers (7)

Billy Hallman
Billy Hallman

Reputation: 41

If you are using something like PHP you could submit the form to a "proxy" page that redirects the header to a specific location + the query.

For example:

HTML:

<form action="proxy.php" method="get"> 
   <input type="text" name="txtquery" />
   <input type="button" id="btnSubmit" />
</form>

PHP (proxy.php)

<?php

   if(isset($_GET['txtquery']))
      $query = $_GET['txtquery'];
   
       header("Location /yourpage/{$query}");


?>

Upvotes: 1

Mikhail Alferov
Mikhail Alferov

Reputation: 29

You will get a trailing question mark when submitting an empty form, if your server adding trailing slash to URL and your action URL of form - is directory (and not file) and:

  • Trailing slash in the action attribute URL (action="/path/").
  • With dot (with or without trailing slash after it) instead specific URL (action="." or action="./").
  • With empty action (action="").
  • Form without action attribute.

Try to specify an action-URL without trailing slash:

action="path"

or

action="./path/sub"

and

action="/path"

or

action="/path/sub"

Upvotes: 0

Jarrod McGuire
Jarrod McGuire

Reputation: 683

I know this is a super old question, but I came across the same issue today. I would approach this from a different angle and my thinking is that in this day and age you should probably be using POST rather than GET in your forms, because passing around values in a querystring isn't great for security and GDPR. We have ended with a lot of issues where various tracking scripts have been picking up the querystring (with PII in the parameters), breaking whatever terms of services they have.

By posting, you will always get the "clean url", and you won't need to make any modifications to the form submit script. You might however need to change whatever is receiving the form input if it is expecting a GET.

Upvotes: 0

Alex Houghton
Alex Houghton

Reputation: 3

Another option would be to check the FormData with javascript before submitting.

var myNeatForm = document.getElementById("id_of_form");
var formData = new FormData(myNeatForm); // Very nice browser support: https://developer.mozilla.org/en-US/docs/Web/API/FormData
console.log(Array.from(formData.entries())); // Should show you an array of the data the form would be submitting.


// Put the following inside an event listener for your form's submit button.
if (Array.from(formData.entries()).length > 0) {
    dealTypesForm.submit(); // We've got parameters - submit them!
} else {
    window.location = myNeatForm.action; // No parameters here - just go to the page normally.
}

Upvotes: 0

Andr&#233; Felipe
Andr&#233; Felipe

Reputation: 364

In my case I'm using window.location, not sure it's the best alternative, but it's the only one I could make it work:

$('#myform').submit(function()
{
    ... if all parameters are empty

    window.location = this.action;
    return false;
});

My real use was to convert GET parameter to real url paths, so here is the full code:

$('#myform').submit(function()
{
    var form = $(this),
        paths = [];

    // get paths
    form.find('select').each(function()
    {
        var self = $(this),
            value = self.val();

        if (value)
            paths[paths.length] = value;

        // always disable to prevent edge cases
        self.prop('disabled', true);
    });     

    if (paths.length)
        this.action += paths.join('/')+'/';

    window.location = this.action;
    return false;
});

Upvotes: 9

Brendon Dugan
Brendon Dugan

Reputation: 2168

Without using Javascript, I'm not sure there is one. One way to alleviate the problem may be to create a hidden input that just holds some junk value that you can ignore on the other side like this:

<input type="hidden" name="foo" value="bar" />

That way you will never have an empty GET request.

Upvotes: 0

J&#243;n Trausti Arason
J&#243;n Trausti Arason

Reputation: 4698

I was looking for similar answer. What I ended up doing was creating a button that redirects to a certain page when clicked.

Example:

<button type="button" value="Play as guest!" title="Play as guest!" onclick="location.href='/play'">Play as guest!</button>

This is not an "answer" to your question but might be a good work around. I hope this helps.

Upvotes: 0

Related Questions