mod_rewrite помогает передать полный путь со строкой запроса

Я выполняю кэширование на основе всего URL-адреса, включая строку запроса, и мне нужно, чтобы Apache распознал файл и использовал его. Кажется, он находит совпадение, но затем удаляет строку запроса перед рендерингом файла.

URL-адрес: www.somesite.com/default.asp?foo=bar

Имя файла кэшированной страницы в файловой системе в папке кэша: default.asp?foo=bar

Моя текущая попытка переписать:

RewriteCond /site_root/cache/%{REQUEST_FILENAME}?%{QUERY_STRING} -f
RewriteRule ^.*$ /site_root/cache/%{REQUEST_FILENAME}?%{QUERY_STRING} [L,QSA]

person Community    schedule 30.04.2009    source источник


Ответы (2)


Возможно, вы захотите попробовать что-то вроде этого:

RewriteRule ^(.+)$ /site_root/cache/$1 [L,QSA]

Это должно переписать "default.asp" в URL-адресе на то, что, как я думаю, вы пытаетесь использовать. QSA должен вызвать добавление исходной строки запроса к переписанному URL-адресу.

Я не уверен на 100%, что это то, что вы ищете, поэтому, если это не так, дайте мне знать, и я постараюсь помочь.

person bchang    schedule 01.05.2009
comment
Спасибо суперчинк. Я использую RewriteLog, чтобы посмотреть, что происходит, и похоже, что ваша попытка отбрасывает строку запроса и пытается сопоставить только default.asp. Мне нужно сохранить имя файла и строку запроса, чтобы apache мог обслуживать файл с тем же именем. Неважно, если это default.asp, index.php или foobar.baz, он должен обслуживать соответствующий файл. Имя файла включает строку запроса, как я уже упоминал выше. - person ; 01.05.2009

Я нашел решение, которое работает для моих нужд.

Кажется, что Apache действительно хочет вывести строку запроса в набор параметров, что нормально.

Чтобы перетащить его на Apache, я просто заменил ? в строке с |. Как только я это сделал, он больше не видел строку как строку запроса. Поскольку параметры не имеют значения, в моем случае все работает нормально. Все, что мне нужно сделать, это убедиться, что я пишу имя файла с вертикальной чертой вместо вопросительного знака. Достаточно легко.

Не стесняйтесь комментировать, если у вас есть лучшее решение.

Вот правило, которое делает это для меня. Поскольку Apache не распознает результат как известный ему MIME, я заставляю его использовать text/html.

RewriteRule ^(.+)$ /site_root/cache/%{HTTP_HOST}$1|%{QUERY_STRING} [L,T=text/html]
person Community    schedule 01.05.2009