避免 nGinx 配置中的重复代码

避免 nGinx 配置中的重复代码

我有一个启用了 PHP APC 缓存的 Wordpress 网站,我想加密对 和 的所有请求http://www.domain.com/wp-login.php*http://www.domain.com/dashboard?action=profile我想强制对其他所有内容建立未加密的连接。

我可以让它工作,但配置非常丑陋,而且乱七八糟。我的问题是我仍然必须将我想要加密的两个字符串传递给 PHP 引擎。一定有更好的方法来做到这一点,而不是重复这么多。

server {
    listen       443;
    ssl     on;
    ssl_certificate /etc/nginx/ssl/new/server.crt;
    ssl_certificate_key /etc/nginx/ssl/new/server.key;

    server_name  www.domain.com domain.com;
    root   /var/www;
    index  index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \wp-login.php.* {
        ##Stuff to send requests to the PHP engine here
    }

    location ~ \dashboard?action=profile.* {
        ##Stuff to send requests to the PHP engine here
    }

    location ~ \.php$ {
        ##Stuff to send requests to the PHP engine here 
    }
}

server {
    listen       80;

    server_name  www.domain.com domain.com;
    root   /var/www;
    index  index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \wp-login.php.* {
        ##Stuff to send requests to the PHP engine here
    }

    location ~ \dashboard?action=profile.* {
        ##Stuff to send requests to the PHP engine here
    }

    location ~ \.php$ {
        ##Stuff to send requests to the PHP engine here 
    }

    location ~ \dashboard/\?action\=profile$ {
        rewrite ^ https://$http_host$request_uri? permanent;    
    }

    location ~ \wp-login.php.* {
        rewrite ^ https://$http_host$request_uri? permanent;    
    }
}

答案1

至于需要 SSL 才能登录和访问仪表板,有多种解决方案。一个简单的方法是编辑wp-config.php并在显示添加的行上方/* That's all, stop editing! Happy blogging. */添加define('FORCE_SSL_ADMIN', true);

就我个人而言,我并不担心滥用 https 版本的网站,因为搜索引擎默认会链接到非 https 版本的网站,所以除非您的用户定期登录,否则只有一小部分人会使用 https 版本的网站,因此服务器负载的增加可以忽略不计,但 YMMV。

你可能会在 Ars Technica 的这篇文章中找到很多建议,Web Served,第 5 部分:您自己的博客,有用。

您可能还想查看常见配置陷阱在 nginx.org。

答案2

为了避免 nginx 在位置块中重复,可以使用 nginx 包含或使用嵌套位置块 - 嵌套位置块示例如下...

    location / {
        proxy_pass http://mywebfeservers;
        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_set_header Host $http_host;
        proxy_set_header X-Request-ID $uuid;
        proxy_set_header Via $via;

        location /aaa {
            # proxy_pass is not inherited, unsure about proxy_http_version
            proxy_pass http://mywebfeservers;
            proxy_http_version 1.1;
            # Prevent caching
            if_modified_since off;
        }
    }

这里所有位置都设置了这些不同的标头。只有 /aaa 位置可以防止缓存,但它仍然使用相同的标头而不重复配置。遗憾的是,您必须重复代理传递,因为继承不适用于代理传递指令(出于我不知道的原因)。

相关内容