我有一个包含 nginx 和 wordpress 的 docker-compose 设置。我按照网上的一个教程操作,一切似乎都运行正常。
但是我有一个关键插件,它直接通过 PHP 生成几个 html/js 文件。这意味着 HTML 代码包含<script>
带有路径的标签/script.js
,插件会捕获该特定名称并以适当的内容响应。这里不涉及 url-rewrite 模块,只有一些自写的(即来自插件)
我不知道如何配置 nginx 以允许 fpm docker 镜像提供服务端生成的 js。
现在我有以下设置:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~* \.php$ {
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location ~ ^/(script1.js|script2.js) {
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location ~* \.(css|js|gif|ico|jpeg|jpg|png)$ {
expires max;
log_not_found off;
}
一旦我重新请求该页面,script1 和 script2 就会响应 404。
一般来说这是可以实现的吗?
答案1
如果静态文件存在,则该try_files
语句将提供静态文件,否则将请求发送到/index.php
。由于script1.js
和script2.js
文件不存在,因此它们由 处理/index.php
,这正是您想要的。
和location ~ ^/(script1.js|script2.js)
块location ~* \.(css|js|gif|ico|jpeg|jpg|png)$
破坏了这个逻辑。
一个解决方案是删除该location ~ ^/(script1.js|script2.js)
块(这是错误的),然后将try_files
语句放入该location ~* \.(css|js|gif|ico|jpeg|jpg|png)$
块中。
例如:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~* \.php$ {
...
}
location ~* \.(css|js|gif|ico|jpeg|jpg|png)$ {
try_files $uri /index.php?$query_string;
expires max;
log_not_found off;
}