.htaccess mod_rewrite GET表单的变量数量未知

时间:2013-02-01 16:47:52

标签: php html forms .htaccess mod-rewrite

我在做什么:

我正在使用高级过滤器(大量复选框)创建搜索,并且我正在使用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 由于是搜索,人们可能会在以后访问同一个网址,因此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编码的[]也会很棒,因为它仍然是丑陋的地狱..任何建议为了让它更漂亮是受欢迎的。)

我发现了一些与我想要的相反的东西 - &gt; .htaccess mod_rewrite with multiple variable in url

但无论如何,我无法让它干扰它,因为我有多个var[]这实际上是否可以通过重写实现?

1 个答案:

答案 0 :(得分: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时,它将被重写并在内部重定向到index.php?z=carddisplay/var1/value1/var2/value2

这只使用一个index.php参数调用PHP页面$_GET['z'],该参数的值为carddisplay/var1/value1/var2/value2

/p/...开头的任何其他请求都会在内部重定向到index.php?z=...而没有剩余的参数。