Sum*_*ai8 12 .htaccess mod-rewrite
当我将多个RewriteCond链接在一起时,只能使用%0- 引用最后一个RewriteCond的捕获组%9.
在以下问题中,url的查询字符串中的参数可以是任何顺序.要将它们解析为花哨的URL,我需要单独匹配查询字符串中的每个参数:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %{QUERY_STRING} param2=([^&]+)
RewriteCond %{QUERY_STRING} param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
Run Code Online (Sandbox Code Playgroud)
就像我指出的......这不起作用.为了解决这个问题,我可以在下一个RewriteCond中引用前一个RewriteCond的捕获组,并将每个参数"传播"到实际的RewriteRule:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %1&%{QUERY_STRING} ^([^&]*)&.*param2=([^&]+)
RewriteCond %1&%2&%{QUERY_STRING} ^([^&]*)&([^&]*)&.*param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
Run Code Online (Sandbox Code Playgroud)
这应该有效,但是对于每个额外的参数,它变得更加混乱.另一个解决方案可能是解析一个参数并在每个参数之后重定向客户端(导致冗长的重定向链,我想避免).
是否有更简洁的方法来访问RewriteRule中所有RewriteCond的捕获组(例如,是否可以命名它们或将它们分配给变量,以便我可以在其他地方引用它们?)
Jon*_*Lin 10
您可以尝试在重写条件中构建目标URL:
RewriteCond ##%{QUERY_STRING} (.*)##(|.*&)param1=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param2=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param3=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param4=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param5=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param6=([^&]+)
RewriteRule ^foo$ /bar%1/%3? [L,R]
Run Code Online (Sandbox Code Playgroud)
当我尝试请求时:
/foo?param1=a¶m2=b¶m6=3¶m3=4¶m5=5¶m4=6
我被重定向到:
/bar/a/b/4/6/5/3
添加任何其他必需的查询字符串参数不会使它看起来比现在更混乱.