Всего записей: 7 | Зарегистр. 30-10-2005 | Отправлено:18:48 30-10-2005
IJCuper
Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору я не силен в работе с апачем, но у меня скрипты не запускаются пока я не сделаю ассоциацию файлов нужного типа на perl.exe . Без этого не работают ни pl ни cgi (даже писанные на PERL) Может быть поможет.
Всего записей: 584 | Зарегистр. 07-07-2004 | Отправлено:20:52 30-10-2005
я не силен в работе с апачем, но у меня скрипты не запускаются пока я не сделаю ассоциацию файлов нужного типа на perl.exe . Без этого не работают ни pl ни cgi (даже писанные на PERL)
тут другая вещь, не связанная с perl
ndelis хм.. пишет же, что access denied, означает что нет доступа под ntfs либо к дире, либо к файлу в ней. Проверь еще, что exe запускается из командной строки
———- Away/DND
Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено:20:55 30-10-2005
ndelis
Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору из командной строки все запускается все права прописанны корректно. Запуск, чтение, изменение — для всех.
тут возможна более серьезная заморочка.
В линухе аппач можно скофигурить для запуска скриптов под определенным ником (suexec), под виндой этого нет.
Под виндой, вроде, все запускается от ника SYSTEM, как и сам апач Может есть какая-то завязка на это.
2 Cheery : и экзешники, и перловые скрипты лежат в одном каталоге. Сообщение «access denied» апач пишет часто, например, когда неправильно прописан путь к интерпретатору перла (не важно причем где, в самом скрипте или в httpd.conf.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Попробуй пропиши в PATH путь к cgi-bin.
Всего записей: 99 | Зарегистр. 03-11-2004 | Отправлено:22:13 30-10-2005
ndelis
Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Идея оригинальна, но результата не дает. Проверил, на всякий случай.
Все оказалось завязано на связку компилятор+операционка, что меня немного удивило.
Пользуйте под виндой MS Visual C++ и проблема отпадает.
Ниже коммент к проблеме, взят с
We’ve found the problem. The env.exe File has been compiled using: >gcc -v Reading specs from c:/djgpp/lib/gcc-lib/djgpp/3.31/specs Configured with: /devel/gnu/gcc/3.3/gnu/gcc-3.31/configurei586-pc-msdosdjgpp —prefix=/dev/env/DJDIR —disable-nlsThread model: singlegcc version 3.3.1
The .exe is running on the console with normal user-privileges verywell, as I previously said.
The Apache Daemon is running as Servicewith SYSTEM-privileges and the DJGPP-compiled executable somehowforces the OS to return a OS5-Access Denied Exception. Another similar..exe File compiled with AFAIK Microsoft Visual C++ 6 is running verywell under the same circumstances where the former does not.
Well, seems that I have to look for a patch, a new version or anothercompiler.
Всего записей: 7 | Зарегистр. 30-10-2005 | Отправлено:02:14 31-10-2005
Marilda
Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Здравствуйте. Устанавливаю локалхост третий раз и только впервые столкнулась проблемой, когда test.pl работает, а тот же самый файл, переименованный в test.cgi выдает ошибку 500.
Через свойства папки расширение cgi сассоциировала с c:/Program Files/Perl/bin/perl.exe, не помогло.
Вы можете сталкиваться с сокращением CGI, занимаясь разработкой сайтов, размещая сайт на хостинге или администрируя выделенный или виртуальный сервер. В этой статье мы расшифруем данное сокращение, расскажем о CGI и окунемся в историю его создания. Также не обойдем стороной и директорию cgi-bin, которая зачастую является спутником технологии CGI.
CGI – что это? Определение и история
CGI (Commom Gateway Interface) – это спецификация интерфейса веб-сервера, которая позволяет выполнять консольные программы для генерации динамических страниц веб-серверов. Данные программы принято называть CGI-скриптами или CGI-приложениями. CGI по сути позволяет использовать консоль ввода и вывода для взаимодействия с клиентом через окно интернет-браузера. Обычно скрипт CGI выполняется во время получения запроса и в результате генерирует ответ для использования совместно с html, или сразу генерирует готовый html-код.
Интерфейс CGI позволяет передавать запросы методом GET или POST, которые попадают на обработку скрипом CGI через стандартный ввод – stdin; также CGI позволяет получать данные из переменных окружения. Результат обработки запроса CGI выводит в стандартный поток вывода — stdout.
Особенностью данного интерфейса является возможность использования различных языков программирования, которые могут работать со стандартным вводом-выводом, что позволяет для обработки данных использовать даже bash.
История создания CGI
Интерфейс CGI был разработан в 1993 году командой Национального центра суперкомпьютерных приложений (NCSA), который изначально был назван спецификацией для вызова исполняемых файлов командной строки в списке рассылки www-talk. В ноябре 1997 года была основана рабочая группа под председательством Кена Коара, которая и присвоила официальное название новому интерфейсу – CGI (версия 1.1).
Особый вклад в разработку спецификации CGI/1.1 внесли:
— Роб МакКул;
— Джон Фрэнкс;
— Ари Луотонен;
— Тони Сандерс;
— Джордж Филлипс.
Для чего нужна директория cgi-bin
Зачастую скрипы CGI могут запускаться только из директорий, которые определены в настройках веб-сервера, как директории поддерживающие запуск CGI-скриптов. Стандартными директориями являются папки с именем cgi и cgi-bin, причем последний вариант получил большую популярность в процессе становления CGI.
Хостинг-провайдер Xost.SU предоставляет хостинга сайтов с поддержкой CGI, где также используется директория cgi-bin для скриптов CGI. Директория cgi-bin создается в корне сайта и его поддоменов.
Путь до директории cgi-bin для сайта:
Для поддомена name.domain.tld:
Где domain.tld – это адрес сайта, а name – префикс имени его поддомена.
Простейший CGI-скрипт
Данный CGI-скрипт написан на Perl. Код скрипта, отвечающий за обработку данных, производит вывод введенного в форму имени на экран. Если имя не введено, то на экран выводится форма. Обратите внимание, что для работы скрипта в системе должна быть установлена библиотека CGI.pm.
EndOfHTML > else < print «Your name is $username. «; >
Модуль Apache mod_alias
Модуль веб-сервера Apache под названием mod_alias обеспечивает связывание URL и различных частей файловой системы хоста, а также перенаправление URL.
Директивы, содержащиеся в этом модуле, позволяют управлять URL-адресами и управлять ими по мере поступления запросов на сервер. Директивы Alias и ScriptAlias используются для сопоставления URL-адресов и путей файловой системы. Это позволяет использовать контент, который не находится непосредственно под DocumentRoot, как часть дерева веб-документа. Директива ScriptAlias имеет дополнительный эффект, помечая целевой каталог как содержащий только сценарии CGI.
Директивы Redirect используются для указания клиентам сделать новый запрос с другим URL. Они часто используются, когда ресурс переехал в новое место.
Когда директивы Alias, ScriptAlias и Redirect используются в разделе или , можно использовать синтаксис выражений для управления целевым путём или URL-адресом.
mod_alias разработан для обработки простых задач манипулирования URL. Для более сложных задач, таких как управление строкой запроса, используйте инструменты, предоставляемые mod_rewrite.
Порядок обработки
Aliases и Redirects, встречающиеся в разных контекстах, обрабатываются так же, как и другие директивы, в соответствии со стандартными правилами слияния. Но когда несколько Aliases или Redirects происходят в одном контексте (например, в одном разделе ), они обрабатываются в определённом порядке.
Во-первых, все Redirects обрабатываются до обработки Aliases, и поэтому к запросу, который соответствует Redirect или RedirectMatch, никогда не будут применяться Aliases. Во-вторых, Aliases и Redirect обрабатываются в том порядке, в котором они появляются в файлах конфигурации, причём первое совпадение имеет приоритет.
По этой причине, когда две или более из этих директив применяются к одному и тому же подпути, вы должны сначала указать наиболее конкретный путь, чтобы все директивы имели эффект. Например, следующая конфигурация будет работать должным образом:
Но если бы указанные выше две директивы были поменяны местами, псевдоним /foo всегда будет соответствовать псевдониму /foo/bar, поэтому последняя директива была бы бессмысленна.
Когда директивы Alias, ScriptAlias и Redirect используются в разделе или , эти директивы будут иметь приоритет над любыми глобально определёнными директивами Alias, ScriptAlias и Redirect.
Директива Alias
Описание: сопоставляет URL-адреса с расположениями файловой системы.
Синтаксис: Alias [URL-путь] путь-к-файлу|путь-к-директории
Директива Alias позволяет хранить документы в локальной файловой системе за пределами DocumentRoot. URL-адреса с (%-декодированным) путём, начинающимся с URL-путь, будут сопоставлены с локальными файлами, начинающимися с путь-к-директории. URL-путь чувствителен к регистру даже в файловых системах без учёта регистра.
Запрос http://example.com/image/foo.gif заставит сервер вернуть файл /ftp/pub/image/foo.gif. Сопоставляются только полные сегменты пути, поэтому указанный выше псевдоним не соответствует запросу для http://example.com/imagefoo.gif. Для более сложного сопоставления с использованием регулярных выражений смотрите директиву AliasMatch.
Обратите внимание: если вы добавите завершающий / в URL-путь, серверу потребуется конечный / для применения псевдонима. То есть, если вы используете
тогда URL /icons не будет считаться совпавшим с псевдонимом, так как в нём отсутствует завершающий /. Точно так же, если вы опустите косую черту в URL-пути, вы также должны убрать её из пути к файлу.
Обратите внимание, что вам может потребоваться указать дополнительные разделы , которые охватывают назначение псевдонимов. Псевдонимы возникают до того, как будут проверены разделы , поэтому затрагивается только место назначения псевдонимов. (Обратите внимание, однако, что разделы выполняются один раз перед выполнением псевдонимов, поэтому они будут применяться.)
В частности, если вы создаёте псевдоним для каталога за пределами вашего DocumentRoot, вам может потребоваться явно разрешить доступ к целевому каталогу.
Любое число косых черт в параметре URL-пути соответствует любому количеству косых черт в запрошенном пути URL.
Если директива Alias используется в разделе или , URL-путь опускается, а путь к файлу интерпретируется с использованием синтаксиса выражений.
Этот синтаксис доступен в Apache 2.4.19 и новее.
Директива AliasMatch
Описание: сопоставляет URL-адреса с местоположениями файловой системы с помощью регулярных выражений.
Эта директива эквивалентна Alias, но использует регулярные выражения вместо простого сопоставления префиксов. Предоставленное регулярное выражение сопоставляется с URL-путём, и если он совпадает, сервер подставляет любые совпадения в скобках в заданную строку и использует её в качестве имени файла. Например, чтобы активировать каталог /icons, можно использовать:
Доступен полный спектр возможностей регулярных выражений. Например, можно создать псевдоним с нечувствительным к регистру сопоставлением URL-пути:
Одно тонкое различие между Alias и AliasMatch заключается в том, что Alias автоматически копирует любую дополнительную часть URI за совпавшей частью в конец пути к файлу с правой стороны, а AliasMatch — нет. Это означает, что почти во всех случаях вам нужно, чтобы регулярное выражение соответствовало всему URI запроса от начала до конца и использовало подстановку с правой стороны.
Другими словами, простое изменение Alias на AliasMatch не будет иметь такого же эффекта. Как минимум, вам нужно добавить ^ в начало регулярного выражения и добавить (.*)$ в конец, а также добавить $1 в конец замены.
Например, предположим, что вы хотите заменить это на AliasMatch:
Это НЕ эквивалентно — не делайте этого! Это отправит все запросы, содержащие /image/ где-либо в них, в /ftp/pub/image/:
Вот что вам нужно для получения такого же эффекта, как в исходной директиве:
Конечно, нет смысла использовать AliasMatch там, где работает Alias. AliasMatch позволяет делать более сложные вещи. Например, вы можете обслуживать разные типы файлов из разных каталогов:
Несколько ведущих косых черт в запрошенном URL-адресе отбрасываются сервером до того, как директивы из этого модуля сравниваются с запрошенным URL-путем.
Директива Directive
Описание: отправляет внешнее перенаправление с просьбой к клиенту получить другой URL-адрес.
Директива Redirect сопоставляет старый URL-адрес с новым, предлагая клиенту повторно загрузить ресурс в новом месте.
Старый URL-путь — это путь с учётом регистра (%-декодированный), начинающийся с косой черты. Относительный путь не допускается.
Новый URL-адрес может быть либо абсолютным URL-адресом, начинающимся со схемы и имени хоста, либо URL-путем, начинающимся с косой черты. В этом последнем случае схема и имя хоста текущего сервера будут добавлены, если у вас установлен UseCanonicalName, в противном случае имя хоста будет заменено запрошенным заголовком Host.
Тогда любой запрос, начинающийся с URL-пути, вернёт клиенту запрос перенаправления в местоположение целевого URL. Дополнительная информация о пути за пределами совпадающего URL-пути будет добавлена к целевому URL-адресу.
Если клиент запрашивает http://example.com/service/foo.txt, ему будет предложено получить доступ к http://foo2.example.com/service/foo.txt. Это включает запросы с параметрами GET, такими как http://example.com/service/foo.pl?q=23&a=42, они будут перенаправлены на http://foo2.example.com/service/foo.pl?q=23&a=42. Обратите внимание, что POST будут отброшены.
Сопоставляются только полные сегменты пути, поэтому приведённый выше пример не соответствует запросу для http://example.com/servicefoo.txt. Для более сложного сопоставления с использованием синтаксиса выражения опустите аргумент URL-пути, как описано ниже. В качестве альтернативы для сопоставления с использованием регулярных выражений смотрите директиву RedirectMatch.
Примечание: директивы перенаправления имеют приоритет над директивами Alias и ScriptAlias независимо от их порядка в файле конфигурации. Директивы Redirect внутри Location имеют приоритет над директивами Redirect и Alias с URL-путем.
Если аргумент статуса не указан, перенаправление будет «временным» (статус HTTP 302). Это указывает клиенту, что ресурс временно перемещён. Аргумент статуса может использоваться для возврата других кодов статуса HTTP:
permanent (постоянный)
Возвращает постоянный статус перенаправления (301), указывающий, что ресурс перемещён навсегда.
temp (временный)
Возвращает временный статус перенаправления (302). Это значение по умолчанию.
seeother (смотри другой)
Возвращает статус See Other «Смотри другое» (303), указывающий, что ресурс был заменён.
gone (ушёл)
Возвращает статус «Gone» (410), указывающий, что ресурс был окончательно удалён. Когда используется этот статус, аргумент URL-адреса следует опускать.
Другие коды состояния могут быть возвращены путём указания числового кода состояния в качестве значения статуса. Если статус находится между 300 и 399, должен присутствовать аргумент URL. Если статус не находится в диапазоне от 300 до 399, аргумент URL-адреса должен быть опущен. Статус должен быть действительным кодом статуса HTTP, известным HTTP-серверу Apache.
Если директива Redirect используется в разделе или с опущенным URL-путем, тогда параметр URL будет интерпретироваться с использованием синтаксиса выражения.
Этот синтаксис доступен в Apache 2.4.19 и новее.
Директива RedirectMatch
Описание: отправляет внешнее перенаправление на основе совпадения регулярного выражения текущего URL-адреса.
Эта директива эквивалентна Redirect, но использует регулярные выражения вместо простого сопоставления префиксов. Предоставленное регулярное выражение сопоставляется с URL-путём, и если он совпадает, сервер подставляет любые совпадения в скобках в заданную строку и использует её в качестве имени файла. Например, чтобы перенаправить все файлы GIF в файлы JPEG с одинаковыми именами на другом сервере, можно использовать:
Соображения, связанные с различием между Alias и AliasMatch, также применимы к различию между Redirect и RedirectMatch. Смотрите подробности в AliasMatch.
Директива RedirectPermanent
Описание: отправляет внешнее постоянное перенаправление с просьбой к клиенту получить другой URL-адрес.
По умолчанию, если целевой URL-адрес директивы Redirect является относительным URL-адресом, начинающимся с символа ‘/’, сервер преобразует его в абсолютный URL-адрес перед ответом клиенту. Если для параметра RedirectRelative установлено значение «ON», относительный URL-адрес предоставляется клиенту напрямую.
Директива RedirectTemp
Описание: отправляет внешнее временное перенаправление с просьбой к клиенту получить другой URL-адрес.
Директива ScriptAlias имеет то же поведение, что и директива Alias, за исключением того, что, за исключением того, что она помечает целевой каталог как содержащий сценарии CGI, которые будут обрабатываться обработчиком cgi-script mod_cgi. URL-адреса с чувствительным к регистру (%-декодированным) путём, начинающимся с URL-путь, будут сопоставлены сценариям, начинающимся со второго аргумента, который является полным путём в локальной файловой системе.
Запрос http://example.com/cgi-bin/foo заставит сервер запустить скрипт /web/cgi-bin/foo. Эта конфигурация по существу эквивалентна:
ScriptAlias также можно использовать вместе с имеющимся у вас скриптом или обработчиком. Например:
В этом сценарии все файлы, запрошенные в /cgi-bin/, будут обрабатываться файлом, который вы настроили, это позволяет вам использовать свой собственный обработчик. Вы можете использовать это как оболочку для CGI, чтобы вы могли добавлять контент или какое-либо другое действие на заказ.
Безопаснее не помещать скрипты CGI в DocumentRoot, чтобы случайно не раскрыть их исходный код, если конфигурация когда-либо изменится. ScriptAlias упрощает это, отображая URL-адрес и одновременно определяя скрипты CGI. Если вы все же решили разместить свои скрипты CGI в каталоге, уже доступном из Интернета, не используйте ScriptAlias. Вместо этого используйте , SetHandler и Options, как в:
Это необходимо, поскольку несколько URL-путей могут отображаться в одно и то же расположение файловой системы, потенциально обходя ScriptAlias и открывая исходный код сценариев CGI, если они не ограничены разделом Directory.
Если директива ScriptAlias используется в разделе или с опущенным URL-путем, тогда параметр URL будет интерпретироваться с использованием синтаксиса выражений.