Веб-сервер, не включающий строку запроса при выполнении перезаписи 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
Веб-хост пользователя заявил:
Мой ответ:
Мне бы очень хотелось, чтобы они могли объяснить, что "устарело" в следующем коде.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; так это был "новый" апач. Пожалуйста, попросите их объяснить.