我已经在 server_name 中使用正则表达式配置了我的 nginx 虚拟主机。nginx 在日志和传递给 php-fpm 的参数中显示原始正则表达式(我知道有$_SERVER['HTTP_HOST']一个真正的价值,这不是问题)。我的问题是如何让 nginx 将真实主机名而不是正则表达式写入日志。
server_name 指令如下所示:
server_name ~^(:?(?<second>.+)\.)?(?<domain>[^.]+\.[^.]+)$;
我正在创建一个连接到服务器并将输出转储到临时文件的脚本。我想在脚本中使用 sed 从临时文件中获取特定信息。输出总是有 80 个字符的虚线,然后是我想要的信息,然后是 Disconnected 语句。
如果它只是一行,我已经得到了一个正则表达式,问题是我如何对换行符进行分组?
正则表达式
-\{80\}[\r\n]*\(.*\)[\r\n]\{4\}Disconnected
Run Code Online (Sandbox Code Playgroud)
文件
...
--------------------------------------------------------------------------------
The information that I want to get can be a single line or multiple lines.
Another line to grab.
And this should be caught as well.
Disconnected ...
Run Code Online (Sandbox Code Playgroud)
期望输出
The information that I want to get can be a single line or multiple lines.
Another line to grab.
And this should be caught as well.
Run Code Online (Sandbox Code Playgroud) 我似乎无法弄清楚为什么 header_checks 没有被评估。我使用的是 Ubuntu 12.04、postfix 2.7、dovecote、spamassasin、clamav、amavis。
我将以下行添加到 /etc/postfix/main.cf :
header_checks = regexp:/etc/postfix/header_checks
Run Code Online (Sandbox Code Playgroud)
这是 header_checks :
/From: .*/ REPLACE From: noreply@valid.mydomain.com
Run Code Online (Sandbox Code Playgroud)
要测试正则表达式:
#postmap -q "From: <werwe>" regexp:/etc/postfix/header_checks
Run Code Online (Sandbox Code Playgroud)
它评估正确并给我返回输出:
REPLACE From: noreply@valid.mydomain.com
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从命令行或 php 网页发送电子邮件时,postfix 将不会替换 From 标头。我很困惑。
我想重写所有外发电子邮件:
From: Confirmation Email<webapp@invalid.mydomain.com>
Run Code Online (Sandbox Code Playgroud)
- 变成 -
From: Confirmation Email<noreply@valid.mydomain.com>
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
我想用 Nginx 做一些事情。假设我有几个用户和一个子域,每个用户在/home/dev/sites/USER_ID. 我想USER_ID.dev.example.com指向那个目录。
我试过制作一个 vhost 文件如下:
server {
listen 80;
server_name ~^(?<site_id>)$.dev.example.com;
root /home/dev/sites/$site_id;
index index.php;
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,所有发生的事情是它显示了我的 PhpMyAdmin 安装(显然另一个虚拟主机指向它)。有人能告诉我我做错了什么吗?我有一种感觉,它只是糟糕的 Regex,但我不确定。
以下一直在为我缓存 css 和 js:
location ~ "^(.*)\.(min.)?(css|js)$" {
expires max;
}
Run Code Online (Sandbox Code Playgroud)
结果:
$ curl -I http://mysite.com/test.css
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 16 Jan 2014 18:55:28 GMT
Content-Type: text/css
Content-Length: 19578
Last-Modified: Mon, 13 Jan 2014 18:54:53 GMT
Connection: keep-alive
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
X-Backend: stage01
Accept-Ranges: bytes
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 10 位 unix 时间戳为我的 js/css 设置版本控制,并且在使用以下有效正则表达式获取正则表达式匹配时遇到问题。
location ~ "^(.*)([\d]{10})\.(min\.)?(css|js)$" {
expires max;
}
Run Code Online (Sandbox Code Playgroud)
结果:
$ curl -I http://mysite.com/test_1234567890.css
HTTP/1.1 200 OK
Server: nginx
Date: Thu, …Run Code Online (Sandbox Code Playgroud) 如果我跑
fail2ban-regex '31.22.105.115 - - [11/Apr/2014:18:09:54 +0100] "GET /admin/config.php
HTTP/1.0" 301 573 "-" "-"' '^<HOST> - - (?:\[[^]]*\] )+\"(GET|POST)/(?i)(PMA|phptest|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|cgi-bin)'
Run Code Online (Sandbox Code Playgroud)
然后我明白了Success, the total number of match is 1。然而如果我有一个access.log包含
.
.
109.68.191.26 - - [11/Apr/2014:12:47:50 +0100] "GET / HTTP/1.0" 301 541 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
31.22.105.115 - - [11/Apr/2014:18:09:54 +0100] "GET /admin/config.php HTTP/1.0" 301 573 "-" "-"
Run Code Online (Sandbox Code Playgroud)
和一个filter.d.conf 文件包含
failregex = '^<HOST> - - (?:\[[^]]*\] )+\"(GET|POST) /(?i)(PMA|phptest|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|cgi-bin)'
Run Code Online (Sandbox Code Playgroud)
,我尝试跑步,fail2ban-regex path/to/access.log /etc/fail2ban/filter.d/apache-getphp.conf我明白了Sorry, no match,为什么?
下面的重写工作正常:
rewrite ^/city/restaurants$ /city/listings/restaurants permanent;
Run Code Online (Sandbox Code Playgroud)
但这不起作用
rewrite ^/city/restaurants$ /city/listings/restaurants last;
rewrite ^/city/restaurants$ /city/listings/restaurants break;
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
位于整个 nginx 服务器块下方
server {
listen 80 default backlog=1024;
server_name mydomain.com;
client_max_body_size 20M;
charset utf-8;
keepalive_timeout 50;
access_log /var/log/access_log main;
error_log /var/log/error_log info;
root /var/www/;
index index.php index.phtml index.html;
autoindex on;
location ~ \..*/*\.php$ {
return 403;
}
location ~^/sites/.*/private/{
return 403;
}
location ~^/sites/.*/files/* {
try_files $uri @rewrite;
}
location ~ (^|/)\. {
return 403;
}
location / {
rewrite ^/city/restaurants$ /city/listings/restaurants last;
location …Run Code Online (Sandbox Code Playgroud) 在现有 Web 应用程序的新版本上工作,我需要 nginx 转发根 (/) 和多个要转发到 v2 基础架构(使用 proxy_pass)的特定 URI,而未指定的 URI 必须转发到 v1。
location = /specific_uri1
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location = /specific_uri2
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location / {
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location /(.*)$ {
proxy_pass http://v1.webapp.com;
proxy_set_header Host v1-test.webapp.com;
add_header X-version v1;
add_header X-node $hostname;
}
Run Code Online (Sandbox Code Playgroud)
最后一个 location 指令永远不会匹配,因此所有未声明的内容仍然属于 v2 Web 应用程序。我肯定对 …
我将目录/子目录列表传递到剧本中,如下所示:
dirs=['Web\this','Web\that','Web']
Run Code Online (Sandbox Code Playgroud)
当我实际在这些目录上执行任务时(win_shell,调用构建过程),这工作得很好,但后来我需要复制文件,并且“\”在用作文件名的一部分时不起作用。我有兴趣使用以下内容,因此我将获取大多数构建的模块名称以及根文件夹中的“Web”:
dirs[1].split('\\')[-1]
Run Code Online (Sandbox Code Playgroud)
我希望这会分别返回“this”、“that”和“Web”。
但我找不到任何斜杠或正则表达式魔法的组合来分割我的字符串。我在 StackExchange 中发现了大约 5 个接近的问题/答案,但似乎没有一个能做到这一点。
我也尝试过这个与变化
"{{ dirs[1] | regex_replace('\\','-') }}"
Run Code Online (Sandbox Code Playgroud) 我正在使用 nginx 来检测浏览器中的 webp 支持:
# Check if client is capable of handling webp
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
Run Code Online (Sandbox Code Playgroud)
此代码工作正常,并在客户端支持图像/webp 时将 .webp 分配给 $webp_suffix
然后几行之后我在以下配置中使用这个变量:
location ~ ^/imgs/([0-9]*)/(.*?)(\..+)$ {
add_header X-webp $webp_suffix;
try_files /imgs/$1$webp_suffix /imgs/$1$3 =404;
}
Run Code Online (Sandbox Code Playgroud)
即使两个文件都存在,它总是会导致 e404。标题 X-webp 设置为“.webp”,因此地图工作正常。
更奇怪的是 - 如果我交换 try_files 参数的顺序:
try_files /imgs/$1$webp_suffix /imgs/$1$3 =404;
Run Code Online (Sandbox Code Playgroud)
到
try_files /imgs/$1$3 /imgs/$1$webp_suffix =404;
Run Code Online (Sandbox Code Playgroud)
然后它开始工作并将文件 /imgs/$1$3 发送到浏览器。这怎么可能 ?我在这个逻辑中遗漏了什么吗?
EDIT1:完成 nginx.conf 以重现:
events {
use epoll;
worker_connections 128;
}
http {
# Check if client is …Run Code Online (Sandbox Code Playgroud)