PHP / Apache обработка пользовательских типов файлов

1

Мне интересно, возможно ли создать пользовательскую обработку типов файлов для Apache, которая будет обрабатываться файлом PHP.

То, что я пытаюсь выполнить, - создать своеобразное расширение .phps для просмотра кода в браузере.

Я использую CodeMirror для отображения кода, но я хотел бы, чтобы этот процесс был автоматизирован, так как я просто изменяю расширение .php на .phps, а другой .php файл будет обрабатывать этот файл .phps чтобы я мог впрыснуть исходный код этого файла .phps в HTML файл с CodeMirror.

Надеюсь, моя цель ясна, мне просто интересно, возможно ли это.

Редактировать:

Чтобы уточнить, я хочу настроить это правило для работы с apache.conf, что означает, что он будет работать на всех виртуальных узлах и т.д., А не из файла .htaccess, который должен быть в каждом каталоге на сервере.

Я думаю, что это должно работать с FilesMatch в apache.conf, прямо сейчас это то, с чем я занимаюсь:

<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php
    RewriteEngine on
    RewriteRule ^(.*)$ /tools/code/?file=$1 [L]
</FilesMatch>

Однако я получаю ошибку 400 Bad Request. Я хотел бы построить что-то вроде этого, чтобы Apache обрабатывал файлы .phps изнутри этой конфигурации и не должен использовать файлы .htaccess в каждом каталоге на сервере.

Теги:

3 ответа

0
Лучший ответ

ОК, я понял это, вот что я сделал:

В apache.conf я добавил следующее:

<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php
    RewriteEngine On
    RewriteRule ^(.*)$ /tools/code/index.php [QSA,L]
</FilesMatch>

каталог /tools/ добавлен как псевдоним

Alias /tools "C:/Web/httpdocs/tools/"

Этого достаточно для использования определенного файла index.php как "обработчика".

Я использовал редактор Ace для отображения кода. Чтобы загрузить файл .phps для просмотра в редакторе, я добавил в файл редактора невидимый элемент <textarea> с исходным файлом, загруженным в него:

<textarea id="code" style="display:none;">
    <?=file_get_contents(ltrim($_SERVER['DOCUMENT_ROOT'], '/').$_SERVER['REQUEST_URI']);?>
</textarea>

Я изменил код инициализации в соответствии с моими потребностями:

<script>
    var editor = ace.edit('editor');
    editor.session.setMode('ace/mode/php');
    editor.setTheme('ace/theme/monokai');
    editor.setValue(document.getElementById('code').value);
    editor.gotoLine(1);
    editor.setShowPrintMargin(false);
    editor.setReadOnly(true);
</script>

И voila, у меня есть более продвинутый способ просмотра файлов .phps. Спасибо, что помогли мне подняться.

  • 0
    Но если вы используете такой обработчик (файл index.php), то почему вы должны объявить дополнительный обработчик типа файлов на всех?
  • 0
    Таким образом, все файлы .phps обрабатываются этим конкретным файлом в Apache на сервере по умолчанию, без необходимости .phps сложный URL-адрес для просмотра этого файла или использования файла .htaccess в каждом каталоге. Я хочу, .phps файл .phps просматривался. таким образом. Для меня это имеет больше смысла, чем просто использование предоставленной функции application/x-httpd-php-source или highlight_file() поскольку возможности использования редактора / средства просмотра кода, такого как редактор Ace , намного больше, чем просто способ просмотра по умолчанию .phps файлы
Показать ещё 7 комментариев
1

Это, безусловно, возможно, просто взгляните на документацию. Способ работы обработчиков типов файлов хорошо объяснен, посмотрите на команду AddType. Однако сомнительно, если это хороший подход к тому, что вы называете своей целью, визуализировать исходный код php. Не было бы намного проще и элегантнее использовать переписывание, чтобы передать запрошенный файл сценарию обработчика, который может "публиковать" его по своему усмотрению?

Например, вы можете использовать следующие URL-адреса и внутренне переписать их:

/source/path/to/file.php  => /path/to/handler.php?source=%2Fpath%2Fto%2Ffile.php

Это можно сделать с помощью модуля перезаписи apache или nginx с использованием общего сценария обработчика:

RewriteEngine on
RewriteRule ^/source/(.)*$ /path/to/handler.php?source=$1 [L,B]

Таким образом, вам не нужно определять какой-либо локальный тип файла и вы можете указать файлы php, которые будут отображаться так же, как они: php файлы. Я имею в виду, что php файл - это php файл. Расширение имени файла должно отражать тип содержимого, содержащегося в файле, а не как его следует обрабатывать. Это означало бы, что вы смешиваете отдельные уровни логики.

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


Две заметки для вышеупомянутого правила перезаписи:

  • Вы, возможно, придется включить апачей AllowEncodedSlashes к on, в зависимости от существующей установки сервера
  • вам нужно немного изменить синтаксис, если вы хотите использовать правило перезаписи внутри файлов стиля .htaccess (вам нужно удалить ведущие косые черты, в зависимости от того, где вы размещаете этот файл). Но в целом такие файлы следует избегать по мере возможности: они, как известно, подвержены ошибкам, трудно отлаживаются, иногда вызывают неожиданные побочные эффекты и действительно замедляют работу сервера. Поэтому, если у вас есть доступ к конфигурации хоста серверов, вы должны предпочесть размещение таких правил там.
  • 0
    Я отредактировал свой вопрос для большей ясности.
  • 0
    Я не понимаю, почему этот ответ должен противоречить вашей дополнительной информации. Вышеуказанное предложение, как написано, специально предназначено для конфигурации хоста http-серверов, а не для файлов стилей .htaccess . Вы можете просто создать файл с правилами и включить его в любой хост, на котором вы хотите использовать этот сервис. Легко, чисто и прозрачно. Но, конечно же, есть и другие решения.
0

Добавьте следующий код в httpd.conf или vhost.conf и перезапустите сервер Apache

<IfModule mime_module>
    AddType application/x-httpd-php .phps
</IfModule>

Или вы можете использовать mod_rewrite

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

  • 0
    Я отредактировал свой вопрос для большей ясности.
  • 0
    @Matt Если вы хотите добавить файл phps для всего домена, то добавьте мой код в файл vhosts.conf или httpd.conf

Ещё вопросы

Сообщество Overcoder
Наверх
Меню