我正在努力让网站的 CSS、IMG 和 JS 资源显示出来。我的网站结构如下:
root
classes
templates
public
images
scripts
styles
index.php
Procfile
apache.conf
现在,我知道这个问题是由我的 apache 重写引起的,因为当我包含它们时,我的 PHP 可以工作,但我的图像却不行。当我不包含它们时,我的 PHP 会因为资产工作而崩溃。奇怪的是,我认为我必须在重写规则前面添加一个斜线,因为最初推荐的 index.php 不起作用,必须更改为 /index.php
我的 Proc 文件将 public 设置为根,我的重写如下所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L]
有了上述内容,我的 PHP 代码就可以正常工作了。我的问题是,我该如何做才能让重写结果不破坏我的所有资产的加载?当我查看网站源代码时,它们位于正确的位置,只是我认为它们被阻止加载。
答案1
上面有
apache.conf
apache 重写
apache.conf
似乎是你的“服务器配置”。当 mod_rewrite 指令用于服务器上下文,而不是目录( .htaccess
) 上下文中的工作方式不同,并且可能需要不同的语法。这解释了为什么需要在替换字符串前面加上斜杠,以使其相对于 DocumentRoot(如果没有斜杠,则被视为相对于服务器根)。
因此,REQUEST_FILENAME
服务器变量不能按原样使用服务器上下文,因为请求尚未映射到文件系统。REQUEST_FILENAME
将与相同,REQUEST_URI
并且您的文件系统检查将失败(导致您的静态资源被重写)。
要在服务器上下文中获取变量的最终值REQUEST_FILENAME
,您需要使用基于 URL 的前瞻,即%{LA-U:REQUEST_FILENAME}
。。
请尝试以下操作:
RewriteEngine On
RewriteCond %{LA-U:REQUEST_FILENAME} !-s
RewriteCond %{LA-U:REQUEST_FILENAME} !-l
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule ^ /index.php [L]