Можно ли получить доступ к измененной строке запроса в RewriteCond после применить RewriteRule?
Я пытаюсь применить…
RewriteCond %{QUERY_STRING} ^(.*)&?id=([^&]+)&?(.*)$ [NC]
RewriteRule ^/app\.jsp$ /app/%2?%1%3 [R=302]
… чтобы переписать следующие 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)
Моя идея состоит в том, чтобы добавить дополнительные условные RewriteRule, чтобы удалить завершающий «?» и символы «%» из модифицированный строка запроса, но я не знаю, как получить доступ к последнему в последующих 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 (см. https://tomcat.apache.org/tomcat-9.0-doc/rewrite.html) для таких URL, как https://example.com/my_webapp/app.jsp
- должен работать и с Apache httpd, возможно, с ^app вместо ^/app в Правило перезаписи
- некоторым тестировщикам .htaccess нравится https://htaccess.madewithlove.com/ похоже, не принимают TestStrings, например ?%{СТРОКА ЗАПРОСА}. Поэтому такие случаи следует тестировать непосредственно с помощью Tomcat (или httpd).
пользователь27772