我想通过 PHP 脚本提供我的 JavaScript 文件。
例如:
如果我请求一个名为dir/my_file.js
服务器应该将请求重定向到名为my_script_server.php?src=dir/my_files.js
我如何在 Apache 中执行此操作?
答案1
类似这样的情况可能就是您所追求的:
<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
模块上。
答案2
您可以直接从 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,这可能无法工作)。
我记得有些老版本的浏览器不喜欢在没有正确 mime 类型的情况下提供 javascipt,所以一定要设置它以防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 切断的大量脚本,可能需要考虑。如果这对您来说可能是一个问题,您可以通过多种方式操纵缓存控制来重新获得其优势。
答案3
结合使用以下几种方法:
- mod-rewrite 使 php 看起来像是一个 js 文件
从 php 文件顶部发送一个标头,让浏览器认为它确实是 javascript
header('Content-Type: application/javascript');
真正好的部分是您可以从服务器向“javascript 文件”添加动态内容,例如,将环境从 php 传递到 javascript:
var environment = <?=getenv('APPLICATION_ENV');?>
// More JS code here ...