我最近安装了 NGINX 作为 Apache 服务器的反向代理,以处理静态文件。到目前为止一切顺利,一切都运行良好,除了我不能再为图片添加水印。
我在 Apache 上的 .htaccess 是:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^(.*)wp-content/upload/(.*\.(jpg|JPG|jpeg|png))$ $1watermark.php?src=wp-content/upload/$2
</IfModule>
这是我当前的 vhosts nginx.conf(不适用于水印):
server {
listen 80;
server_name mydomain.com www.mydomain.com ;
error_log /var/www/vhosts/mydomain.com/statistics/logs/error_log.nginx warn;
location / {
proxy_pass http://www.mydomain.com:8080$request_uri;
include /etc/nginx/proxy.conf;
}
location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|ico|swf)$ {
root /var/www/vhosts/mydomain.com/httpdocs;
expires 7d;
}
#This here, isnt working#
location /wp-content/upload/ {
rewrite ^/(.*)wp-content/upload/(.*\.(jpg|JPG|jpeg|png))$ /$1watermark.php?src=wp-content/upload/$2;
}
}
但根本不起作用。我阅读了重写 nginx 文档,尝试了好几天,但仍然找不到让它工作的方法。
答案1
location ~ \.(jpg|jpeg|png|gif|swf|flv|pdf)$
类似的东西看起来是不是很熟悉?这是捕获静态文件请求的一个相当标准的位置。很可能你也有这个,但我显然看不出来,因为你决定只显示一行 Nginx 配置。
现在,我们已经阅读了有关最基本的 nginx 块之一的文档:那个地点,我们知道某些位置优先于其他位置,事实上,我们知道 nginx 逻辑表明,由于您可以使正则表达式位置真正具体,因此它会假定应该首先使用匹配的正则表达式位置。
我们还知道位置 / 是我们可以获得的最不具体的,因为 / 的左前缀匹配与所有可能的 URI 相匹配。
因此,如果存在另一个匹配的位置,则不会使用 location /。考虑到我回复第一部分的静态请求以及您将重写放入 location / 的信息,我们现在可能知道原因了!
如果仍然不起作用,请提供您的配置,以便人们可以使用一些实际数据。
答案2
现在,除了 nginx 重写中的初始斜杠外,表达式看起来相同。由于您已经盯着这个看了好几天,我假设您已经考虑过这部分。
确保带有该重写的位置块确实与图像请求匹配(并且不会被其他位置块覆盖)。当您确信情况确实如此时,请将适当的标志添加到您的 nginx 重写行中。我猜break
在这种情况下是合适的。