Потому что в nginx применяют другой подход для определения существования - через try_files.
Как-то вроде такого (не тестировал кусок конфига):
location @fallback {
rewrite ^/([A-Za-z0-9-]+)/?$ /index.php?page=$1;
}
location / {
try_files $uri @fallback;
}
А ещё лучше, если всё несуществующее в любом случае заворачиваете на index.php, сделать только одно правило вместо кучи rewrite, а в index.php уже разбирать запрос и разбивать его на части.