【问题标题】:Using mod_rewrite to bypass PHP framework for image, js, and css files使用 mod_rewrite 绕过图像、js 和 css 文件的 PHP 框架
【发布时间】: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


【解决方案1】:

我让它工作了。对于那些可能想知道最终答案是什么的人,我会在这里详细说明。

我在我们的模块中创建了符号链接,以便 Apache 可以按照以下格式相对于文档根目录查看它们:

[document root]/images/[module name]/ pointing to /var/www/app/Modules/[module name]/images/
[document root]/css/[module name]/ pointing to /var/www/app/Modules/[module name]/css/
[document root]/js/[module name]/ pointing to /var/www/app/Modules/[module name]/js/

那么重写规则如下:

RewriteCond %{REQUEST_URI} ^/Modules/(.*)/(js|css|images)/(.*)$
RewriteCond %{DOCUMENT_ROOT}/%2/%1/%3 -f
RewriteRule ^(.*)Modules/(.*)/(js|css|images)/(.*)$ %{DOCUMENT_ROOT}/$3/$2/$4 [L]

现在我们可以根据具体情况转移到新位置,同时仍然加快旧代码的速度。

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2014-07-19
    • 1970-01-01
    • 2012-08-04
    • 2012-07-21
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多