Php .htaccess mod_重写GET表单中未知数量的变量
我在做什么: 我正在创建一个带有许多复选框的高级过滤器的搜索,并且我正在使用PHP的特性,将所有过滤器的名称都命名为末尾的[]。以下是一个简化的示例: HTML 对于mod_重写,当前我的重写工作如下: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
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=(.+?)(?:&(.*))?$