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

标签 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 由于是搜索并且人们稍后可能会访问相同的 url,因此 POST 不是一个选项(它不会“保存”其他 session 的所选复选框)。

我想要实现的是 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-encoded [] 也会很棒,因为它仍然很难看..关于获取它的任何建议欢迎更漂亮的人)。

我在这里发现了一些与我想要的相反的东西 -> .htaccess mod_rewrite with multiple variable in 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=... 而无需其余参数。

关于php - .htaccess mod_rewrite 未知数量的 GET 表单变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651110/

相关文章:

php - 使用 codeigniter 事件记录集从 mysql 获取数据时 CodeIgniter 中的 UTF-8 问题

php - 组合 mysql 列以获得嵌套的 json 结果

html - IE8 CSS 相对位置额外空格

边框弄乱了 HTML 宽度

javascript - 提交前验证所有表单数据

python - 如何创建 Python Pyramid View 类而不需要为每个方法指定 'name'

forms - Silex/Symfony2 后验证

php - Laravel - store() 方法突然不起作用

php - bootstrap php 联系表单值显示错误 <br/><b>通知</b> : Undefined variable: myThema in <b>C:\x\testForm. php</b> on line <b>105</b><br/>

php - 分页以显示最大值并限制其余值