2

私がやっていること:

高度なフィルター (多数のチェックボックス) を使用して検索を作成しています。最後に [] を付けてすべて同じ名前にする 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]

これは、 i を呼び出すと、 callhttp://example.comに書き換えられることを意味しますhttp://example.com/index.php

そして、私が呼び出すとhttp://example.com/p/cardlist、それは call に書き換えられます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 エンコードされた [] を削除できれば、まだ地獄のように醜いので、それも素晴らしいでしょう..それをよりきれいにするための提案は大歓迎です)。

ここで必要なものとは逆のものが見つかりました-> URLに複数の変数がある.htaccess mod_rewrite

しかし、とにかく、私はそれをいじることができませんでしたvar[]これは実際に書き換えで達成できますか?

4

1 に答える 1

1

変数を 1 つずつキャプチャして、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 をリクエストすると、URL が書き換えられ、内部的に にリダイレクトされindex.php?z=carddisplay/var1/value1/var2/value2ます。

これは、値を持つ 1 つのパラメーターindex.phpだけで PHP ページを呼び出します。$_GET['z']carddisplay/var1/value1/var2/value2

で始まるその他のリクエストは、残りのパラメータなし/p/...で内部的にリダイレクトされます。index.php?z=...

于 2013-02-01T17:20:03.627 に答える