是否可以在 RewriteCond 中访问修改后的查询字符串后应用重写规则?
我正在尝试应用...
RewriteCond %{QUERY_STRING} ^(.*)&?id=([^&]+)&?(.*)$ [NC]
RewriteRule ^/app\.jsp$ /app/%2?%1%3 [R=302]
... 将以下 URL 重写为“良好”的 URL。这已经有效,但对于 (2) 和 (3),仍然有不必要的尾随“?”和“%”字符,我想删除它们:
/app.jsp?id=123&b=1 -> /app/123?b=1 (1)
/app.jsp?id=123 -> /app/123? (2)
/app.jsp?b=1&id=123 -> /app/123?b=1& (3)
我的想法是添加额外的条件重写规则来删除结尾的“?”和“%”字符修改的查询字符串,但我不知道如何在后续的 RewriteCond 中访问后者。感谢您的任何提示。
答案1
好的,我自己找到了一个简单的解决方案:
RewriteCond %{QUERY_STRING} ^()id=([^&]+)(.*)$ [NC,OR]
RewriteCond \?%{QUERY_STRING} ^(\?.*)&id=([^&]+)(.*)$ [NC]
RewriteRule ^/app\.jsp$ /app/%2%1%3 [R=302,QSD,L]
重写结果:
/app.jsp?id=123&b=1 -> /app/123?b=1 (1)
/app.jsp?id=123 -> /app/123 (2)
/app.jsp?b=1&id=123 -> /app/123?b=1 (3)
/app.jsp?b=1&id=123&d=2 -> /app/123?b=1&d=2 (4)
一些评论:
- 已成功通过 Apache Tomcat 的 Rewrite Valve 测试(参见https://tomcat.apache.org/tomcat-9.0-doc/rewrite.html) 类似这样的网址https://example.com/my_webapp/app.jsp
- 应该也可以与 Apache httpd 一起使用,可能使用 ^app 而不是 ^/app重写规则
- 一些 .htaccess 测试人员喜欢https://htaccess.madewithlove.com/似乎不接受这样的 TestStrings?%{请求参数}. 因此,应直接使用 Tomcat(或 httpd)测试此类情况。