我有一个使用FastCGI的Web应用程序。这个应用程序被部署为不同的“网站”。我有一个应用程序的一般nginx配置,然后,我为每个站点包含upstrams和位置文件。每个站点都需要一些.js和.css文件。现在,我通过通用配置文件的root
来设置它们。我现在的要求是,我希望能够为不同的网站使用不同的.css和.js。因此,查找文件应首先从网站/位置级别开始,如果找不到,则在常规root
中搜索。Nignx尝试在不同位置的不同目录中的文件
一般的nginx的conf文件是:
# Change this directory depending on the server
include /etc/nginx/conf.d/app/upstreams/*.conf;
server
{
server_name 24.39.17.76;
root /var/www/app/files/;
listen 443;
ssl on;
ssl_certificate /etc/nginx/conf.d/app/ssl/new/app.pem;
ssl_certificate_key /etc/nginx/conf.d/app/ssl/new/app.com.key;
location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|svg|woff|ttf)$ {
access_log off; # this is because otherwise, with jail2ban the user may be banned
# add_header Access-Control-Allow-Origin "*";
expires max;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
add_header Pragma public;
}
# Change this directory depending on the server
include /etc/nginx/conf.d/app/locations/*.conf;
}
记下我包括所有位置的线CONF和上行流文件。
然后一个特定的网站,拥有上游文件,如:
upstream siteX
{
server localhost:9021;
server localhost:9022;
server localhost:9023;
}
和位置文件,像这样的:
location ~ ^/siteX/reps {
access_log /var/log/nginx/app/siteX_reps_access.log;
error_log /var/log/nginx/app/siteX_reps_error info;
if ($arg_service = "true") {
rewrite ^/(.*)$ /service/$1 last;
}
rewrite ^/siteX/(.*)$ /$1 break;
try_files $uri @fastcgiSiteX;
}
location @fastcgiSiteX {
include fastcgi_params;
fastcgi_param REQUEST_URI $uri?$args;
fastcgi_pass fastcgiSiteX;
fastcgi_next_upstream error invalid_header http_500;
}
我的网页,其中包括CSS和JS的HTML是像这个:
<script type="text/javascript" src="/JQDevelopmentLibrary/jQuery.js"></script>
<link rel="stylesheet" type="text/css" href="/TBSDevelopmentLibrary/css/bootstrap.css"/>
但我可以很容易地添加一个前缀,如果这有助于任何可能的解决方案,如:
<script type="text/javascript" src="/siteX/webfiles/JQDevelopmentLibrary/jQuery.js"></script>
<link rel="stylesheet" type="text/css" href="/siteX/webfiles/TBSDevelopmentLibrary/css/bootstrap.css"/>
SO ...一般文件位于/ var/www/app/files /下。但是,我希望对siteX来说,文件首先在另一个路径中搜索,比如说/ var/www/siteX/files,并且只有在找不到的时候才搜索到。
一个解决方法我试过,但没有工作是定义该try_files
表达:
try_files /siteX/webfiles$uri $uri @fastcgiSiteX;
然后,我把所有的文件夹和文件在$ DOCUMENT_ROOT/SITEX/webfiles,就是/var/www/app/files/siteX/webfiles/
。我认为这个解决方案应该可行,但事实并非如此。
任何想法?
在此先感谢,
嗨。我正在尝试这个解决方案,但我有一个问题。 'try_files $ uri @hack;'将尝试$ uri上的文件,这将在我的案例中找到。然后它会回落到@hack。我需要其他方法,首先用'/ var/www/siteX/files'做一个try_files,如果找不到,则回退到'/ var/www/app/files /'。任何想法如何适应您的解决方案?谢谢 – 2014-10-10 15:54:19