Как веб-сервер находит файл на сервере через URL? - PullRequest
5 голосов
/ 22 января 2011

Кто-нибудь когда-нибудь пытался реализовать веб-сервер?Или знаете что-нибудь о недоделке работающей программы веб-сервера?Мне интересно, что происходит именно с того момента, когда веб-сервер получает URL-адрес, чтобы файл на веб-сервере находился и отправлялся обратно в качестве ответа.

Сохраняет ли сервер только внутреннюю таблицу, чтобы запомнить сопоставление междуURL-адреса, которые он поддерживает, и соответствующие локальные пути?Или есть что-нибудь более хитрое?

Спасибо!

Обновление

Спасибо за ваши ответы.Вот мое понимание на данный момент.

Я проверил с помощью Microsoft IIS (Internet Information Service), я заметил, что IIS может разместить несколько сайтов, и каждый сайт IIS запоминает его корневой путь в локальной файловой системе.Разные сайты на одном и том же хосте имеют одно и то же имя или IP-адрес и различаются по разным портам.Например:

http://www.myServer.com:1111/folderA/pageA.htm

Веб-сервер будет использовать www.myServer.com: 1111 часть строки URL, чтобы определить, какой путь в его локальной файловой системе будет использоваться, а затемв этом локальном пути он ищет подпапку folderA , а затем файл pageA.htm .

Веб-сервер только необходимо запомнитьследующее отображение между двумя простыми строками:

"http://www.myServer.com:1111/" <---> "D:\myWebRoot"

Я не знаю, где хранится такая информация отображения, возможно, некоторые файлы конфигурации для рассматриваемой Программы веб-сервера.

Но результатом этого сопоставления granularity является то, что мы можем получить доступ только к контенту в этой сопоставленной локальной папке.Мы не могли выполнить произвольное сопоставление.

Обновление - 2 -

Я нашел, где IIS хранит сопоставление, вот несколько цитат из applicationHost.config:

<sites>
    <site name="Default Web Site" id="1" serverAutoStart="false">
        <application path="/">
            <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:" />
            <binding protocol="net.tcp" bindingInformation="808:*" />
            <binding protocol="net.pipe" bindingInformation="*" />
            <binding protocol="net.msmq" bindingInformation="localhost" />
            <binding protocol="msmq.formatname" bindingInformation="localhost" />
        </bindings>
    </site>
    <site name="myIISService" id="2" serverAutoStart="true">
        <application path="/" applicationPool="myIISService">
            <virtualDirectory path="/" physicalPath="D:\MySites\MyIISService" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:8022:" />
        </bindings>
    </site>
    <siteDefaults>
        <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
        <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
    </siteDefaults>
    <applicationDefaults applicationPool="DefaultAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Обновление - 3 -

После того, как я прочитал ответ foo , мой недостаток "сервера" увеличился.Я хочу сделать некоторые комментарии, основанные на моем недавнем изучении WCF.

Независимо от того, какой это сервер, мы всегда можем отправлять им сообщения, указывая протокол, URL, порт.Например:

[http://www.myserver.com:1111/]page.htm

[net.tcp://www.myserver.com/]someService.svc/someMethod

[net.msmq://www.myserver.com/]someService.svc

[net.pipe://localhost/]

После того, как сообщения поступят в серверную программу с использованием частей в квадратных скобках вышеуказанных URL-адресов, остальная часть URL будет отправлена ​​серверной программе в качестве входных данных.для дальнейшей обработки.И следующее поведение может быть таким же простым, как подача статического контента, или сложным, как генерация динамического контента.

Ответы [ 3 ]

3 голосов
/ 22 января 2011

Для серверов, которые обслуживают «файлы», типичным подходом является обработка части пути URL-адреса как относительного пути, начинающегося с «корневого каталога», определенного в конфигурации сервера.Тем не менее, URL не обязательно должен соответствовать файлу на диске;он может соответствовать объекту или методу в работающем веб-приложении, записи в базе данных или чем-либо еще.

3 голосов
/ 22 января 2011

Зависит от веб-сервера и того, на чем он сфокусирован.

(Конечно, для всех элементов, проверка прав доступа, переназначение и такие шаги применимы.)

  • Общее-целевые веб-серверы, такие как Apache, начинают с файлов и каталогов, поэтому они разбивают URL-адрес на иерархическое описание пути, пытаются найти файл в заданном месте и обслуживать его, если он существует.(Это становится более сложным с модулями и типами файлов; некоторые типы файлов подразумевают обработку файла как сценария и возвращение выходных данных сценария, а не просто извлечение содержимого файла и т. Д.).

  • Серверы приложений, такие как Tomcat, выполняют сопоставление с сервлетами;если они нашли сервлет, который будет обрабатывать URL, они вызывают его и передают любые оставшиеся части / параметры URL для дальнейшей обработки.

  • Встроенные веб-серверы могут даже использовать жестко закодированные таблицы поиска длядоступные шаблоны URL, напрямую связанные с вызываемыми функциями.

  • Специализированные веб-серверы будут делать все, что требуется;некоторые даже не анализируют URL, а только другие заголовки (как это делают некоторые потоковые серверы).

Все зависит от того, чего вы хотите достичь.В большинстве случаев вам лучше всего использовать nginx или Apache и, возможно, некоторые модули и / или тонкую настройку.

Имейте в виду, что любой HTTP-заголовок может использоваться для отображения запроса на любые средства.производства продукции у вас есть.Имя хоста, порт и URL используются чаще всего, но вы также можете взять IP-адрес языка или клиента или другие данные заголовка и использовать их в сопоставлении.

Итак, для вашего вопроса: да, это может быть так просто, кактот;и да, это может быть значительно сложнее (с отображением, переписыванием и сложной обработкой).

1 голос
/ 22 января 2011

Для статических файлов обычно нет средств отображения. Единственное, что нужно знать веб-серверу, - это абсолютный путь файловой системы диска к общедоступному корню веб-документа, который обычно определяется где-то в каком-то файле конфигурации развертывания (httpd.conf для Apache HTTPD, server.xml и / или context.xml для Apache Tomcat и т. Д.). Веб-сервер извлекает соответствующую часть из URL, преобразует ее в абсолютный путь к файловой системе диска на основе пути к корню веб-документа, находит файл на диске и передает его в потоковом режиме.

...