.htaccess mod_rewrite Неизвестное количество переменных формы GET

Что я делаю:

Я создаю поиск с расширенными фильтрами (много флажков), и я использую эту функцию PHP, чтобы дать им все то же имя с [] в конце. Вот упрощенный пример:

(HTML)

<h3>Elements</h3> <label><input type="checkbox" name="elementPicked[]" value="1" checked="checked" /> Fire</label> <label><input type="checkbox" name="elementPicked[]" value="2" checked="checked" /> Water</label> <label><input type="checkbox" name="elementPicked[]" value="3" checked="checked" /> Wind</label> <h3>Rarity</h3> <label><input type="checkbox" name="rarityPicked[]" value="10,11,12" /> Common</label> <label><input type="checkbox" name="rarityPicked[]" value="19,20,21,22" /> Uncommon</label> <label><input type="checkbox" name="rarityPicked[]" value="29,30,31,32" /> Rare</label> <!-- (...other somethingPicked[] types, like atk, def and cost...) --> 

(PHP)

 if(!empty($_GET['elementPicked'])) { foreach($_GET['elementPicked'] as $elementPicked) { //do something with each $elementPicked } } 

Для mod_rewrite в настоящее время мой переписывающий файл работает следующим образом:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #Example: ./ RewriteRule ^index$ index.php [NC,L] #Example: ./p/dashboard RewriteRule ^p/([^/]*)$ index.php?z=$1 [NC,L,QSA] 

Это означает, что если я вызову http://example.com , он перепишет для вызова http://example.com/index.php .

И если я позвоню http://example.com/p/cardlist , он переписал бы вызов http://example.com/index.php?z=cardlist . Довольно легко это.

Итак, теперь проблема htaccess:

Для этой формы URL-адрес выглядит следующим образом: http://example.com/p/carddisplay?elementPicked%5B%5D=1&elementPicked%5B%5D=2&elementPicked%5B%5D=3&rarityType=Select&rarityPicked%5B%5D=39%2C40%2C41%2C42&rarityPicked%5B%5D=49%2C50%2C51%2C52 Поскольку поиск и люди могут появиться на одном и том же URL позже, POST не является вариантом (он не будет «сохранять» выбранные флажки для другого сеанса) ,

То, чего я хотел достичь, было http://example.com/p/carddisplay/var1/something/var2/something/var3/something... или перевод приведенного выше примера, http://example.com/p/carddisplay/elementPicked%5B%5D/1/elementPicked%5B%5D/2/elementPicked%5B%5D/3/rarityType/Select/rarityPicked%5B%5D/39%2C40%2C41%2C42/rarityPicked%5B%5D/49%2C50%2C51%2C52 (или если можно удалить URL-кодированный [] был бы ужасно, потому что он все еще уродлив, как черт .. Любые предложения по его хорошему приветствуются).

Я нашел что-то INVERSE для того, что я хотел здесь, -> .htaccess mod_rewrite с несколькими переменными в url

Но в любом случае, я не мог заставить его работать с ним, потому что у меня более одного var[] . Можно ли это сделать с переписыванием?

Вы можете фиксировать переменные по одному в RewriteCond и цикл на этом

 RewriteEngine On RewriteBase / # capture query string variables RewriteCond %{QUERY_STRING} ^(.+?)=(.+?)&(.+)$ RewriteRule ^/?p/carddisplay.*$ $0/%1/%2?%3 [L] # capture last variable and redirect RewriteCond %{QUERY_STRING} ^(.+?)=(.+?)$ RewriteRule ^/?p/carddisplay.*$ $0/%1/%2? [R,L] # redirect URL with empty query string to index.php RewriteCond %{QUERY_STRING} ^$ RewriteRule ^/?p/(.*)$ index.php?z=$1 [NC,L] 

Это происходит до тех пор, пока существует строка запроса и создается новый URL-адрес, а затем отправляется переадресация клиенту.

Если вы хотите удалить []/%5B%5D , измените RewriteCond на что-то вроде этого

 RewriteCond %{QUERY_STRING} ^(.+?)%5B%5D=(.+?)(?:&(.*))?$ 

Что здесь происходит?

Когда запрос /p/carddisplay?var1=value1&var2=value2 поступает из формы, браузер сначала перенаправляется на /p/carddisplay/var1/value1/var2/value2 . Когда браузер запрашивает этот URL-адрес, он переписывается и внутренне перенаправляется на index.php?z=carddisplay/var1/value1/var2/value2 .

Это вызывает страницу PHP index.php с одним параметром $_GET['z'] , который имеет значение carddisplay/var1/value1/var2/value2 .

Любой другой запрос, начинающийся с /p/... , внутренне перенаправляется на index.php?z=... без остальных параметров.