简单的 nginx 重定向不匹配
Simple nginx redirect doesn't match
我本来想做一个复杂的 URL 重写,但我无法开始工作,所以将它剥离回一个简单的 URL 重定向,这肯定可以工作,但它会抛出 404 .
对 [any_scheme]://www.mydomain.com/google 的请求应重定向到 https://www.google.com/
nginx.conf
(未发布,因为它不包含服务器块,所以不会冲突?)
mydomain.com.conf:
server {
server_name www.mydomain.com;
root /home/mydomain/public_html;
index index.php index.html index.htm;
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /home/mydomain/ssl.combined;
ssl_certificate_key /home/mydomain/ssl.key;
access_log /var/log/virtualmin/mydomain.com_access_log;
error_log /var/log/virtualmin/mydomain.com_error_log;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
location = /google {
return 302 https://www.google.com/;
}
#rogue .htaccess files caught here
location ~ /\.ht {
deny all;
}
}
#force non-www. to www.
server {
server_name mydomain.com;
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
return 301 $scheme://www.mydomain.com$request_uri;
}
根据您的日志条目:您正在请求 /google/
(注意尾部斜杠),但这与 /google
位置不匹配,因为那里没有尾部斜杠。
因此您需要两个完全匹配的位置:
location = /google {
return 302 https://www.google.com/;
}
location = /google/ {
return 302 https://www.google.com/;
}
使用 curl -v
调试服务器的运行情况。
你用sites-available
/ sites-enabled
吗?不。参见 https://serverfault.com/a/870709/110020。 sites-available
/ sites-enabled
是不标准的,是邪恶的,不要使用它,请改用 conf.d
。
确保你确实重新加载了 nginx。参见 。直接尝试 sudo nginx -s reload
和 sudo pkill -HUP nginx
。
检查 error_log
和 access_log
。确保活动日期与您提出的新要求相符。我建议打开多个终端 windows,并在每个终端中执行 tail -f
,然后按 return 将新输入与旧的,然后才执行请求。
您是否在 nginx 之上使用任何额外的代理?这些可能是问题的原因。
我本来想做一个复杂的 URL 重写,但我无法开始工作,所以将它剥离回一个简单的 URL 重定向,这肯定可以工作,但它会抛出 404 .
对 [any_scheme]://www.mydomain.com/google 的请求应重定向到 https://www.google.com/
nginx.conf (未发布,因为它不包含服务器块,所以不会冲突?)
mydomain.com.conf:
server {
server_name www.mydomain.com;
root /home/mydomain/public_html;
index index.php index.html index.htm;
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /home/mydomain/ssl.combined;
ssl_certificate_key /home/mydomain/ssl.key;
access_log /var/log/virtualmin/mydomain.com_access_log;
error_log /var/log/virtualmin/mydomain.com_error_log;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
location = /google {
return 302 https://www.google.com/;
}
#rogue .htaccess files caught here
location ~ /\.ht {
deny all;
}
}
#force non-www. to www.
server {
server_name mydomain.com;
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
return 301 $scheme://www.mydomain.com$request_uri;
}
根据您的日志条目:您正在请求 /google/
(注意尾部斜杠),但这与 /google
位置不匹配,因为那里没有尾部斜杠。
因此您需要两个完全匹配的位置:
location = /google {
return 302 https://www.google.com/;
}
location = /google/ {
return 302 https://www.google.com/;
}
使用
curl -v
调试服务器的运行情况。你用
sites-available
/sites-enabled
吗?不。参见 https://serverfault.com/a/870709/110020。sites-available
/sites-enabled
是不标准的,是邪恶的,不要使用它,请改用conf.d
。确保你确实重新加载了 nginx。参见 。直接尝试
sudo nginx -s reload
和sudo pkill -HUP nginx
。检查
error_log
和access_log
。确保活动日期与您提出的新要求相符。我建议打开多个终端 windows,并在每个终端中执行tail -f
,然后按 return 将新输入与旧的,然后才执行请求。您是否在 nginx 之上使用任何额外的代理?这些可能是问题的原因。