如果 url 包含特定单词,nginx 如何重定向到 wordpress 文件夹
nginx how to redirect to wordpress folder if url contains specific word
首先,我的域根配置为使用重定向到本地 ip/port 的反向代理服务 Angular 网页,这非常有效。如果 url 包含我想重定向到 wordpress 文件夹的 /blog
,当我想覆盖根规则时,问题现在就来了。目前,使用此配置,我可以访问 wordpress,但只能访问特定的 url,例如 example.com/blog/wp-admin/index.php
,但如果我访问 example.com/blog
仍会访问 angular 应用程序。我已经配置了我的 nginx 如下(我不得不说我是第一次配置网络服务器):
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name example.com www.example.com;
client_max_body_size 100M;
root /var/www;
index index.php index.html index.htm index.nginx-debian.html;
autoindex off;
location ~ /blog(.*)+/(.*)$ {
try_files $uri $uri/ /blog/index.php?$args /blog/index.php?q=$uri&$args;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location / {
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true; proxy_redirect off;
http2_push /var/www/example_frontend/dist/example-frontend/favicon.ico;
http2_push /var/www/example_frontend/dist/example-frontend/manifest.json;
}
location /robots.txt {
alias /var/www/example_frontend/robots.txt;
}
location /sitemap.xml {
alias /var/www/example_frontend/sitemap.xml;
}
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
如果我停止我的 angular 应用程序,它工作得很好,所以我想我需要首先触发 /blog 位置,但我尝试了所有可能的形式,但没有结果。有人看到有什么问题吗?我以为第一个规则先被触发,但似乎没有。
提前致谢。
如果需要,我可以附加任何其他配置文件;)
URI /blog
与您的 location
的正则表达式不匹配,这需要在 URI 中的某处添加额外的 /
才能匹配。
最简单的解决方案是:
location /blog {
try_files $uri $uri/ /blog/index.php?q=$uri&$args;
...
}
以上将匹配 /blog
和 /blog/
,但也匹配 /blogx
(这可能是不受欢迎的)。
您可以使用修改后的正则表达式,例如:
location ~ ^/blog(/|$) {
try_files $uri $uri/ /blog/index.php?q=$uri&$args;
...
}
最有效的解决方案是使用前缀位置,但需要输入更多内容:
location /blog {
return 301 /blog/;
}
location /blog/ {
try_files $uri $uri/ /blog/index.php?q=$uri&$args;
...
}
有关更多信息,请参阅 this document。 顺便说一下,您的 try_files
语句包含一个虚假参数。
首先,我的域根配置为使用重定向到本地 ip/port 的反向代理服务 Angular 网页,这非常有效。如果 url 包含我想重定向到 wordpress 文件夹的 /blog
,当我想覆盖根规则时,问题现在就来了。目前,使用此配置,我可以访问 wordpress,但只能访问特定的 url,例如 example.com/blog/wp-admin/index.php
,但如果我访问 example.com/blog
仍会访问 angular 应用程序。我已经配置了我的 nginx 如下(我不得不说我是第一次配置网络服务器):
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name example.com www.example.com;
client_max_body_size 100M;
root /var/www;
index index.php index.html index.htm index.nginx-debian.html;
autoindex off;
location ~ /blog(.*)+/(.*)$ {
try_files $uri $uri/ /blog/index.php?$args /blog/index.php?q=$uri&$args;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location / {
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true; proxy_redirect off;
http2_push /var/www/example_frontend/dist/example-frontend/favicon.ico;
http2_push /var/www/example_frontend/dist/example-frontend/manifest.json;
}
location /robots.txt {
alias /var/www/example_frontend/robots.txt;
}
location /sitemap.xml {
alias /var/www/example_frontend/sitemap.xml;
}
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
如果我停止我的 angular 应用程序,它工作得很好,所以我想我需要首先触发 /blog 位置,但我尝试了所有可能的形式,但没有结果。有人看到有什么问题吗?我以为第一个规则先被触发,但似乎没有。
提前致谢。
如果需要,我可以附加任何其他配置文件;)
URI /blog
与您的 location
的正则表达式不匹配,这需要在 URI 中的某处添加额外的 /
才能匹配。
最简单的解决方案是:
location /blog {
try_files $uri $uri/ /blog/index.php?q=$uri&$args;
...
}
以上将匹配 /blog
和 /blog/
,但也匹配 /blogx
(这可能是不受欢迎的)。
您可以使用修改后的正则表达式,例如:
location ~ ^/blog(/|$) {
try_files $uri $uri/ /blog/index.php?q=$uri&$args;
...
}
最有效的解决方案是使用前缀位置,但需要输入更多内容:
location /blog {
return 301 /blog/;
}
location /blog/ {
try_files $uri $uri/ /blog/index.php?q=$uri&$args;
...
}
有关更多信息,请参阅 this document。 顺便说一下,您的 try_files
语句包含一个虚假参数。