Apache: Как я могу обслуживать JavaScript через PHP?

Я хочу обслуживать мои файлы JavaScript через скрипт PHP.

Примером может быть:

Если бы я запросил файл JavaScript с именем dir/my_file.js

Сервер должен перенаправить запрос в скрипт-обработчик my_script_server.php?src=dir/my_files.js

Как я могу сделать это в Apache?

3 ответа

Решение

Что-то похожее на это, вероятно, то, что вы ищете:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(dir/.*\.js)$ my_script_server.php?src=$1 [L,QSA]
</IfModule>

Линии, которые заканчиваются -f а также -d убедитесь, что файла еще нет, а окончательное правило ищет запросы, соответствующие .js файлы в папке dir/ и прозрачно отправляет их в ваш PHP-скрипт.

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

В документации Apache есть много информации о mod_rewrite модуль.

Вы можете просто обслуживать скрипт из php-файла - он отлично работает в ASP, поэтому должен быть одинаково хорош для PHP.

Я обычно сохраняю ".js" в имени файла, чтобы знать, что к чему, с первого взгляда, например "some_dynamic_script.js.asp" или в вашем случае "some_dynamic_script.js.php". Затем просто убедитесь, что ваш скрипт выводит правильно отформатированный ответ javascript и включите его обычным способом, например <script type="text/javascript" src="some_dynamic_script.js.php"> - вы даже можете передать опции в строке запроса для php-кода, чтобы реагировать на это, например, как <script type="text/javascript" src="some_dynamic_script.js.php?option1=value1&option2=value2&option3=value3">,

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

Я помню, что были проблемы с некоторыми старыми браузерами, которым не нравился javascipt без правильного типа mime, поэтому убедитесь, что вы установили это с header("Content-Type: text/javascript"); на всякий случай (в противном случае ответом, вероятно, будет сервер в виде text/html по умолчанию) - хотя я только что заметил, что часть моего кода этого не делает и работает нормально в IE6/7/8, FF2/3/3.5/3.6 и хотя бы одна версия Chrome.

Одна важная проблема, о которой следует знать, используете ли вы mod_rewrite или php более напрямую, это, конечно, то, что если код php делает что-то с вводом из строки запроса или базы данных приложения, вы должны убедиться, что, как и весь ваш код, что данные должным образом проверяются, чтобы избежать потенциальных инъекций и атак XSS.

Другая, более незначительная проблема, о которой следует знать, это управление кэшем. Процессор PHP по умолчанию помечает вывод как всегда требующий повторного запроса, где для простого JS-файла Apache может вернуть ответ "304 не изменен", если браузер указывает, что он ранее сделал тот же запрос, что если скрипт возвращение без изменений может привести к потере пропускной способности и замедлению ответа для удаленных пользователей. Это не проблема, если ваше приложение всегда размещается на HTTPS (поскольку ничто не обслуживается через HTTPS, в любом случае его следует кэшировать), но это может быть проблемой для больших блоков сценария, разрываемых по HTTP. Если это может быть проблемой для вас, есть способы, которыми вы можете манипулировать контролем кэша, чтобы восстановить его преимущество.

Используйте комбинацию вещей:

  • переписать мод, чтобы php выглядел как js-файл
  • отправьте заголовок из верхней части php-файла, чтобы браузер решил, что это действительно javascript

    header('Content-Type: application/javascript');

Действительно приятная часть заключается в том, что вы можете добавить динамический контент в "файл javascript" с сервера, например, так, передавая среду из php в javascript:

var environment = <?=getenv('APPLICATION_ENV');?>

// More JS code here ...
Другие вопросы по тегам