我在 apache 上开发,现在需要在 ngix 上部署,但遇到了一些困难。由于我的项目(使用 cakephp)中禁用了内联样式,并且数据库中定义了一些颜色,因此我让 RsrcController 生成带有颜色的 css 到模板中。
仅当我不使用文件扩展名 .css,而只使用带有控制器和函数的斜线 Url 时,调用此函数才有效。
如果我附加以 .css 结尾的文件,nginx 将在 webroot 文件夹中搜索并返回 404。
这是配置的相关部分:
location / {
try_files $uri $uri/ /index.php?$args;
}
#pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
我尝试找到一个解决方案,添加另一个位置规则,如下所示:
location ~ rsrc/css_vars/~.css {
... [->second part of my question]
}
我不想将所有 .css 文件传递给 php。只想传递那些我希望动态生成的文件。无论如何,我的更改似乎不起作用。
第二部分:
Cakephp 的工作方式如下:http://url.com/controller/function/var1/var2/varx 我的控制器是 rsrc。我的函数是 css_vars。然后有一些变量(用户......)最后我需要“.css”。
我想将 URl 重写为相同的,但不使用文件扩展名“.css”。有没有办法绕过正则表达式?
答案1
我实施了以下解决方案:
#special for rsrc controller
location ~ ^/rsrc/css_vars/.*\.css$ {
rewrite "^(.+)\.\w+$" "$1" last;
}
如果请求针对的是 rsrc 控制器和函数 css_vars,这将从请求中删除 .css。
答案2
你也可以这样做:
location ~ ^(/rsrc/css_vars/.+)\.css$ {
rewrite ^ "$1" last;
}
这样效率更高一些,因为我们只触发一次正则表达式引擎,并捕获指令中所需的部分location
。我还将其更改为不匹配/rsrc/css_vars/.css
路径,因为*
版本也会匹配它。