Я хочу обслуживать свои файлы JavaScript с помощью сценария PHP.
Примером может быть:
Если бы я запросил файл JavaScript с именем dir/my_file.js
Сервер должен перенаправить запрос в сценарий обработчика, называемый my_script_server.php?src=dir/my_files.js
Как я могу это сделать в Apache?
Вы можете просто передать скрипт из файла 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. Если это может быть проблемой для вас, есть способы, которыми вы можете манипулировать контролем кеша, чтобы восстановить его преимущество.
Что-то похожее на это, вероятно, то, что вам нужно:
<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, чтобы браузер подумал, что это действительно javascript
header('Content-Type: application/javascript');
Действительно приятная часть заключается в том, что вы можете добавлять динамический контент в файл javascript с сервера, например, таким образом, передавая среду с php на javascript:
var environment = <?=getenv('APPLICATION_ENV');?>
// More JS code here ...