【发布时间】:2018-12-04 21:16:23
【问题描述】:
我们正在使用流行的 PHP 框架来托管网站。
我们添加了一些附加功能,允许我们制作自定义模块,将控制器、服务对象、PHP 模板、Javascript、CSS 和图像封装到一个子目录中。
我们在供应商目录之外创建了它,以将这些模块与第三方库区分开来。
我想做的是拥有 Apache 2.2。在这些模块中提供图像、js 和 css,而不是通过 PHP。
我尝试编辑 .htaccess 文件以直接返回文件。它不起作用,我似乎找不到有关如何执行此操作的文档。
网址格式为:
https://example.com/Modules/cart/images/shopping_cart.png
https://example.com/Modules/cart/js/shopping_cart.js
https://example.com/Modules/cart/css/shopping_cart.css
这是我目前所拥有的:
RewriteCond %{REQUEST_URI} ^/Modules/(.*)/images/(.*)$
RewriteCond /var/www/app/%{REQUEST_URI} -f
RewriteRule ^/Modules/(.*)/images/(.*)$ /var/www/app/Modules/$1/images/$2 [L]
我错过了什么?
编辑添加:
Modules 目录位于虚拟主机的文档根 /var/www/public 之外,因此它们当前通过 PHP 提供服务。我实际上是在尝试优化当前正在运行的网站。
[更新]
根据@Dave 提供的信息,我创建了一个从文档根目录到模块图像目录的子目录的符号链接。
所以符号链接的形式是[document root]/images/[module name]/ 指向/var/www/app/Modules/[module name]/images/。
但是我仍然收到以下标头,表明它正在通过 PHP:
Request URL: https://example.com/Modules/cart/images/shopping_cart.png
Server: Apache/2.4.35 (FreeBSD)
X-Powered-By: PHP/7.2.10
我的新重写规则是:
RewriteCond %{REQUEST_URI} ^/Modules/(.*)/images/(.*)$
RewriteCond %{DOCUMENT_ROOT}/images/$1/$2 -f
RewriteRule ^/Modules/(.*)/images/(.*)$ %{DOCUMENT_ROOT}/images/$1/$2 [L]
【问题讨论】:
-
是什么让您相信他们将通过 PHP?浏览器直接请求这些资源,PHP 不会参与。
-
响应中的标头表明它正在通过 PHP。 Modules 目录位于虚拟主机的文档根目录之外。
-
在这种情况下,我认为没有办法实现它,因为 Apache 无法看到文档根目录上方的任何内容。
-
根据您的编辑,我建议您将静态资源(例如
.js和.css文件)移到 Apache 能够看到它们的地方。这也将允许它们被缓存,这将有助于您的整体性能,因为它们不应该经常被提供。 -
@Dave 我试图避免在文档根目录中进行符号链接,因为我们有几十个模块。当然,我们不希望 PHP 源代码在文档根目录中可用,因此我们必须单独链接静态资源。谢谢。
标签: php .htaccess frameworks