Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php .htaccess mod_重写GET表单中未知数量的变量_Php_Html_Forms_.htaccess_Mod Rewrite - Fatal编程技术网

Php .htaccess mod_重写GET表单中未知数量的变量

Php .htaccess mod_重写GET表单中未知数量的变量,php,html,forms,.htaccess,mod-rewrite,Php,Html,Forms,.htaccess,Mod Rewrite,我在做什么: 我正在创建一个带有许多复选框的高级过滤器的搜索,并且我正在使用PHP的特性,将所有过滤器的名称都命名为末尾的[]。以下是一个简化的示例: HTML 对于mod_重写,当前我的重写工作如下: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #Example: ./ RewriteRule ^index$ index.php [NC,L] #Exam

我在做什么:

我正在创建一个带有许多复选框的高级过滤器的搜索,并且我正在使用PHP的特性,将所有过滤器的名称都命名为末尾的[]。以下是一个简化的示例:

HTML

对于mod_重写,当前我的重写工作如下:

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. 这个很简单

那么,现在是访问问题:

对于此表单,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编码的[]也会很棒,因为它仍然很丑。。欢迎任何让它更漂亮的建议

我在这里找到了与我想要的相反的东西->


但无论如何,我不能让它工作,因为我有多个var[]。这真的可以通过重写来实现吗

您可以在and循环中逐个捕获变量

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 %{QUERY_STRING} ^(.+?)%5B%5D=(.+?)(?:&(.*))?$
这里发生了什么? 当请求/p/carddisplay?var1=value1&var2=value2来自表单时,浏览器首先重定向到/p/carddisplay/var1/value1/var2/value2。当浏览器请求这个URL时,它会被重写并在内部重定向到index.php?z=cardisplay/var1/value1/var2/value2

这将使用一个$_GET['z']参数调用PHP page index.PHP,该参数的值为cardisplay/var1/value1/var2/value2


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

如果我在我的htaccess示例前面加上:。/,表单提交仍然会转到http://192.168.1.150/aeria.immortalis.index/p/carddisplay?elementPicked%5B%5D=1&elementPicked%5B%5D=2&elementPicked%5B%5D=3 但服务器返回未找到的对象!404.如果我在重写规则^p/[^/]*$index.php?z=$1[NC,L]后放入,表单提交仍然会转到http://192.168.1.150/aeria.immortalis.index/p/carddisplay?elementPicked%5B%5D=1&elementPicked%5B%5D=2&elementPicked%5B%5D=3 好像它不存在/未在条件中输入。我试着把它去掉?从^/?p/开始,但不改变行为described@RaphaelDDL我根据您的评论更改了我的答案,并纳入了您现有的规则。我希望,这次我做对了。谢谢你的尝试:但是现在除了索引,没有其他页面可以工作了。我相信所有的页面都是查询字符串,因为我正在转换http://example.com/index.php?z=somepage 进入http://example.com/p/somepage“不是吗?”拉斐尔德说,“不是,http://example.com/index.php?z=somepage 没有改变。它保持这种方式,并将调用PHP页面。我认为/p/carddisplay是您想要更改的唯一URLhttp://example.com/p/somepage 不要再工作了。我的代码重写规则^p/[^/]*$index.php?z=$1[NC,L,QSA]转换此请求http://example.com/p/somepage 进入http://example.com/index.php?z=somepage 对于服务器。仅使用您的代码http://example.com/ 和http://example.com/index.php 有效,而carddisplay甚至没有打开。我想知道URL是否真的必须对SEO友好?@SalmanA我只是不想使用post,因为我希望用户能够随时返回结果页面。是的,我想知道我是否应该放弃在搜索中创建更友好的URL的想法。现在我再想想,这似乎是个愚蠢的想法,对吧/
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]
RewriteCond %{QUERY_STRING} ^(.+?)%5B%5D=(.+?)(?:&(.*))?$