Веб-сервер, не включающий строку запроса при выполнении перезаписи URI.htaccess

Я опубликовал некоторый код веб-страницы на GitHub, и он используется довольно многими людьми без проблем. Но совсем недавно один человек связался со мной, чтобы сообщить, что у него есть проблема с изображением, которое не отображается должным образом. Изображение генерируется php-файлом, и я использую.htaccess переписать, чтобы ссылаться на файл как.png в URL-адресах, но внутренне обрабатывать на веб-сервере как.php.

Насколько я понимаю, сервер apache должен включать исходную строку запроса в URI по умолчанию, но веб-сервер этого человека этого не делает. Это первый человек, который сообщил о проблеме, и мне не удалось воспроизвести проблему на веб-серверах, которые я протестировал. Я не уверен в среде веб-сервера этого человека.

Это неправильный вывод изображения, о котором сообщает пользователь:
https://freiezocker-clan.de/bf4stats/common/server-banner/image-banner.png?sid=1

Результат, полученный на изображении выше, говорит о том, что требуется идентификатор сервера. Sid находится в строке запроса, но игнорируется. На других веб-серверах все работало нормально.

Вот как должен выглядеть вывод изображения (во избежание перезаписи.htaccess):
https://freiezocker-clan.de/bf4stats/common/server-banner/image-banner.php?sid=1

Это была моя реализация.htaccess до того, как пользователь сообщил о проблеме:
RewriteEngine on
RewriteRule ^(.*)\.png $1.php [NC]

Это была моя попытка исправить (но безуспешно) описанную проблему:
RewriteEngine on
RewriteRule ^(.*)\.png $1.php?%{QUERY_STRING} [QSA,NC,L]

Не могли бы вы объяснить мне, почему веб-сервер этого пользователя не содержит строку запроса и / или не могли бы вы помочь мне внести изменение, которое исправит проблему для этого пользователя?

Спасибо!

2 ответа

Решение

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

При этом мне придется переосмыслить код своей веб-страницы, чтобы включить дополнительную информацию в имя файла в URL-адресе и извлечь его оттуда.

https://forum.myrcon.com/showthread.php?6854&p=139120&viewfull=1

Веб-хост пользователя заявил:

https://forum.myrcon.com/showthread.php?6854-BF4-Stats-webpage-for-XpKiller-s-Stats-Logger-Plugin-1-0-0-2-(Updated-2-18-2017)&p=139086&viewfull=1

Мой ответ:

Мне бы очень хотелось, чтобы они могли объяснить, что "устарело" в следующем коде.htaccess. Как, конкретно, что? Потому что я не вижу никаких "старых" команд перезаписи ниже. Все перечисленные ниже "старые" команды перечислены как совершенно действительные в "новой" документации 2.4.

RewriteEngine on
RewriteRule ^(.*)\.png $1.php [NC,L]

Ваш веб-сервер переписывает URI, как и ожидалось; так что работает. Не работает то, что ваш веб-сервер прерывает строку запроса. Могут ли они объяснить?

http://httpd.apache.org/docs/current/mod/mod_rewrite.html

По умолчанию строка запроса передается без изменений. Однако вы можете создавать URL-адреса в строке подстановки, содержащей часть строки запроса. Просто используйте знак вопроса внутри строки замещения, чтобы указать, что следующий текст должен быть повторно введен в строку запроса. Если вы хотите стереть существующую строку запроса, завершите строку подстановки только знаком вопроса. Чтобы объединить новые и старые строки запроса, используйте флаг [QSA].

Поэтому, пожалуйста, спросите их, почему их сервер не ведет себя так, как он говорит "по умолчанию".

Это потому что я не включаю этот материал?

DocumentRoot "/var/www/example.com"
<Directory "/common/server-banner">
</Directory>

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

В этом отношении к "старой" и "новой" документации Apache предъявляются одинаковые требования, и она прекрасно работает на "старых" серверах; поэтому он должен прекрасно работать и на "новых" серверах. На самом деле, он отлично работает на вашем веб-сервере (переписывает имя файла, как и ожидалось); просто ваш веб-сервер по какой-то причине отсекает строку запроса.

Фактически серверная версия, на которой я тестировал, была Apache версии 2.4.23; так это был "новый" апач. Пожалуйста, попросите их объяснить.

Другие вопросы по тегам