Что я делаю:
Я создаю поиск с расширенными фильтрами (много флажков), и я использую эту функцию 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=...
без остальных параметров.