Текущие решения зависят от клиента, использующего Javascript / jQuery - что не может быть гарантировано.Другой вариант - использовать правило перезаписи.На сервере Apache я использовал следующее, чтобы убрать пустые значения $ _GET из отправленных форм;
RewriteCond %{REQUEST_URI} \/formpage\/?
RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]
RewriteRule .* \/formpage?%1%2 [R,L,NE]
..., что перевернуло бы это;;
http://www.yoursite.com/formpage?search=staff&year=&firstname=&surname=smith&area=
... в это;
http://www.yoursite.com/formpage?search=staff&surname=smith
Краткое объяснение:
RewriteCond %{REQUEST_URI} \/formpage\/?
- это способ ограничить область вашего регулярного выражения определенной подстраницей адреса вашего сайта (например, http://www.yoursite.com/formpage). Это не обязательно, но вы можете пожелатьприменить выражение только к странице, на которой появляется форма. Это один из способов выполнить это.
RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]
- это второе условие, которое затем сопоставляется со строкой запроса (то есть все, что появляется из (или включая) вопросительный знак, например ?firstname=sam$surname=smith
). Давайте разберем его;
^(.*)
- Символ ^
означает, что это НАЧАЛОстрока запроса и период .
говорят о ЛЮБОМ символе. Звездочка *
является модификатором периодаподстановочный знак, говорящий о том, что любое количество из них должно быть включено в область действия. (&|\?)[a-z-_]+=(?=&|$)
- это самый интересный бит (если вам нравятся такие вещи ...).Это находит вашу пустую строку запроса.Между первыми скобками мы заявляем, что строка начинается с амперсанда ИЛИ с буквальным знаком вопроса (обратная косая черта делает следующий символ буквальным, в данном случае - в противном случае знак вопроса имеет другое значение).Между квадратными скобками мы говорим, что соответствуют любому символу из az, ИЛИ дефису -
ИЛИ подчеркиванию _
, и сразу после этого символ плюса +
указывает, что мы должны соответствовать любому из этих предыдущих символов 1 или болеераз.Знак равенства =
как раз и выглядит (равенство между именем строки запроса и ее значением).Наконец, между следующими круглыми скобками у нас есть предварительное предложение ?=
, в котором говорится, что следующий символ ДОЛЖЕН БЫТЬ АМПЕРСАНДОМ ИЛИ в самом конце строки, как указано знаком доллара $
.Предполагается, что ваша строка запроса будет считаться совпадающей, только если за ней следует начало другой строки запроса или конец строки без , включая значение. - Последние биты
(.*)$ [NC]
просто сопоставляется с любым содержимым, которое следует за пустой строкой запроса, а предложение [NC]
означает, что это случай iSsENsiTIve.
RewriteRule .* \/formpage?%1%2 [R,L,NE]
где мы говорим mod_rewrite, что делать с нашим соответствующим контентом.По сути, переписав URL-адрес вашего имени страницы, следуйте всей строке запроса , за исключением соответствующих пустых строк.Поскольку это будет зацикливать ваш URL до тех пор, пока он не перестанет находить совпадение, не имеет значения, если у вас есть одно пустое значение или 50. Он должен определить их все и оставить только те параметры, которые были переданы со значениями.Предложение [NE]
в правиле перезаписи означает, что символы не будут закодированы в URL - что может или не может быть полезным для вас, если вы ожидаете специальных символов (но вам, очевидно, необходимо очистить данные $ _GETкогда вы его обрабатываете, что вы должны делать в любом случае).
Опять же - это, очевидно, решение Apache, использующее mod_rewrite.Если вы работаете в другой операционной системе (например, на сервере Windows), это необходимо изменить соответствующим образом.
Надеюсь, это кому-нибудь пригодится.