перезапись nginx — файлы существуют, но переписываются

#url-rewriting #nginx #rewrite

#nginx #перезапись url

Вопрос:

у меня есть php-приложение под /path/

все, что не существует (файлы / каталоги), должно быть перенаправлено на /path/index.php

 if (!-e $request_filename)
{
  rewrite ^/path/(. )$ /path/index.php last;
}
  

и по какой-то причине все работает отдельно от реальных файлов.css-файлы, которые существуют, по-прежнему перенаправляются в индекс … например /path/CSS/style.css

Обновить

исправлено с помощью rewrite ^/path/(. )/$ /path/index.php last; , потому что все мои URL-адреса, которые необходимо переписать, заканчиваются косой чертой, но все еще сбивают с толку

nginx.conf

 http {
 include       /etc/nginx/mime.types;  
 access_log  /var/log/nginx/access.log;

 sendfile        on;

 keepalive_timeout  65;
 tcp_nodelay        on;

 gzip  on;
 gzip_disable "MSIE [1-6].(?!.*SV1)";

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;
}
  

полная поддержка сайта /file

 server {
  listen  valueyourvote.org.nz:80;
  server_name  valueyourvote.org.nz valueyourvote.co.nz;

  if ($http_host != www.valueyourvote.org.nz) {
      rewrite  (.*)  http://www.valueyourvote.org.nz$1;
  }
  access_log  /var/log/nginx/valueyourvote.org.nz.access.log;
  error_log   /var/log/nginx/valueyourvote.org.nz.error.log;
  location / {
    root   /var/www/vote.incode.co.nz/;
    index  index.php index.html index.htm;
  }

  if (!-e $request_filename)
  {
    rewrite ^/supercity-2010/(. )/$ /supercity-2010/index.php last;
  }


  # Pass all .php files onto a php-fpm/php-fcgi server.
  location ~ .php$ {
    fastcgi_pass   localhost:9000;
    fastcgi_index  index.php;

    include fastcgi_params;
  }

  # deny access to .htaccess files, if Apache's document root
  # concurs with nginx's one
  location ~ /.ht {
     deny  all;
  }
}   
  

Ответ №1:

Вам следует избегать использования «if» в nginx, когда это возможно — см. «If is evil» в nginx Wiki. Для вашего использования лучшей директивой было бы использовать try_files.

Что касается неработающих директив, вы тестируете файлы за пределами области действия вашей директивы «root», то есть nginx не знает, где искать, чтобы увидеть, являются ли эти URI файлами!

Поместите директиву try_files внутри вашего блока location, и это должно сработать.

Комментарии:

1. я попытался, try_files основываясь на приведенной здесь информации michaelshadle.com/2009/03/19/… Но это не помогло, возможно, в другом месте конфигурации происходит что-то странное, но это всего лишь базовая установка на ubuntu, поэтому с ними все должно быть в порядке

2. Если бы вы могли предоставить больше настроек nginx, возможно, мы смогли бы найти ошибку 🙂

Ответ №2:

Вы можете сделать вот так

 location [your_location]{
   try_files $uri $uri/ @w;
 }
location @w {
rewrite ^/path/(. )$ /path/index.php last;
}