问题
Here are my nginx configure files.
On the default.conf, the first location is used to access /usr/share/nginx/html directory, it is ok while I access http://47.91.152.99. But when I add up a new location for directory /usr/share/nginx/public directory, nginx return me a 404 page while I access http://47.91.152.99/test.
So, what is the matter? Am I misuse the directive of nginx?
/etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ^~ /test/ {
root /usr/share/nginx/public;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
回答1:
The following erroneous block (in your case);
location ^~ /test/ {
root /usr/share/nginx/public;
index index.html index.htm;
}
is telling nginx to look for directory 'test' into the folder (root) /usr/share/nginx/public. If there's no 'test' folder in that root, it will return 404. To paliate to your problem, i suggest you try using alias instead of root. Like so:
location ^~ /test/ {
alias /usr/share/nginx/public;
index index.html index.htm;
}
Also, just for kicks, index directive can be set generally so you don't have to re-write it all the time... like so;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
location / { }
location ~^/test/ {
alias /usr/share/nginx/public;
}
location = /50x.html {
root /usr/share/nginx/html;
}
}
One thing you should also consider... the more 'precise' the location block, the higher in your config it should reside. Like that location = /50x.html
. In a perfect world, that would be set up top, right after the general server block settings.
Hope it helps.
回答2:
Error caused by root directive
location ^~ /test/ {
root /usr/share/nginx/public;
index index.html index.htm;
}
Fix with alias directive
location ^~ /test/ {
alias /usr/share/nginx/public;
index index.html index.htm;
}
Other Improvements
Extra tip: the index directive can be set so that you don't have to re-write it.
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
location / { }
location ~^/test/ {
alias /usr/share/nginx/public;
}
location = /50x.html {
root /usr/share/nginx/html;
}
}
nginx matches Location blocks partly based on position in the config. Ideally, you would invert what you have now. The location block would be higher in nginx config. To that end, the location = /50x.html would also move up. Order is
- Exact match =
- Forward match ^~ /
- Case sensitive regex ~ /
- Case insensitive regex ~*
- Path match /
More about nginx location priority. Also, you can always review the official documentation. The nginx documentation for location block http://nginx.org/en/docs/http/ngx_http_core_module.html#location
回答3:
In my case, if you are hosting multiple sites check server_name
it might be wrongly pointed. Have a look on that as well.
来源:https://stackoverflow.com/questions/41099318/nginx-location-404-not-found