Nginx-如何防止wordpress劫持所有位置,以便可以将某些位置用于角度x?

时间:2019-04-03 11:33:33

标签: angular wordpress nginx

有一点背景知识,我基本上希望某些站点通过wordpress进行操作,而其他部分通过angular 7进行操作。

因此website.com将进入wordpress主页,website.com/signin将进入有角度的网站。这可能吗?我一直在玩Nginx设置,这是到目前为止。不幸的是,它迫使所有内容都通过wordpress网站,因此当我点击/signin时,我会得到一个wordpress生成的404。

路由要比这复杂得多,理想的方案是将某些路径起点列入白名单,然后将其路由到有角度的路径,同时将其他任何路径路由到wordpress(对于该相对通用的404)。例如,

website.com/signin         --
website.com/users/:id        |
website.com/signout          |- all of these route to angular
website.com/otherModels/:id  |
website.com/another        --

website.com/everything-else-goes-to-wordpress

我可以使用wordpress或angular来工作,但它们似乎正在使用竞争的索引文件。我的角度使用index.html,而wordpress使用index.php(同时,如果我没记错的话,会劫持其目录中的所有其他调用)。这是我用于wordpress的nginx文件:

server {
    root /var/www/website.com;
    index index index.html index.php index.htm index.nginx-debian.html;
    server_name website.com;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_buffers 8 16k; # increase the buffer size for PHP-FTP
        fastcgi_buffer_size 32k; # increase the buffer size for PHP-FTP
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }
}

还有角度:

server {
    root /path/to/angular-project/dist;
    index index index.html index.php index.htm index.nginx-debian.html;
    server_name website.com;

    location / {
        proxy_pass http://localhost:4200;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        try_files $uri $uri/ $uri$args /index.html;
    }
}

我显然可以将位置添加到其他文件,但是当我这样做时,location / {}中设置的任何一个都起作用,而另一个则不起作用。例如,如果我将wordpress文件更改为包含以下内容:

location = /signin {
    root /path/to/angular-project/dist; // I've tried using alias as well
    proxy_pass http://localhost:4200;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    try_files $uri $uri/ $uri$args /index.html;
}

什么都没发生。我仍然得到我的wordpress 404(而不是有角的网站)。我可以将上面的代码段更改为location = /signin { return 404; },然后得到一个nginx 404,因此我知道该位置可以正常工作。实际上,直到在/index.html行的末尾添加try_files为止,我一直遇到nginx 404错误。这使我相信try_files /index.html不会以某种方式重定向到wordpress(被劫持)。反之亦然。在角度/关键字之间,在location / {}中设置了hichever,它为应该由另一个定义的位置确定了404。

有没有一种方法可以防止wordpress / angular劫持所有“索引”文件?

1 个答案:

答案 0 :(得分:0)

我很支持Richard Smith的评论。基本上,据我所知,Wordpress正在使用我在index中定义的所有内容,其中包括index.html(角度项目的根)。为了避免这种情况,我专门告诉nginx将index.html请求路由到angular。

location = index.html {
    root /path/to/angular-project/dist; // I've tried using alias as well
    proxy_pass http://localhost:4200;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

这迫使所有通过index.html进行的路由都被路由到我的角度应用程序。进行此更改后,我可以将特定链接定向到angular,同时将默认路由(也称为其他任何路由)保留给wordpress。但是,这还会导致其他错误。所有的js / css / etc文件仍然通过wordpress路由。这就是我所做的(尽管可能有更简单的方法)。

location ~* .(js|css|png|jpg|jpeg|svg|otf)$ {
    root /path/to/angular-project/dist;
    try_files $uri @wordpress_files;
}
location @wordpress_files {
    root /var/www/website.com;
    try_files $uri $uri/ $uri$args;
}

完成此操作后,我的网站将尝试先查找角度特定的文件。如果失败,它将加载wordpress的版本。如果文件具有相同的名称,则无法解决此问题,但是如果是这样,则希望它们具有相同的版本,因此可以安全地加载其中任何一个。