web-dev-qa-db-ja.com

URLの書き換え、nginxは404エラーをスローし、エラーログには何もありません

以下の書き換えはうまくいきます:

rewrite ^/city/restaurants$ /city/listings/restaurants permanent;

しかし、これは機能しません

rewrite ^/city/restaurants$ /city/listings/restaurants last;
rewrite ^/city/restaurants$ /city/listings/restaurants break;

何がいけないの?

nginxサーバーブロック全体の下

  server {
          listen 80 default backlog=1024;
          server_name mydomain.com;


          client_max_body_size 20M;
          charset utf-8;
          keepalive_timeout 50;

          access_log /var/log/access_log main;
          error_log /var/log/error_log info;


          root /var/www/;
          index index.php index.phtml index.html;
  autoindex on;

   location ~ \..*/*\.php$ {
       return 403;
   }
   location ~^/sites/.*/private/{
       return 403;
   }
   location ~^/sites/.*/files/* {
       try_files $uri @rewrite;
   }
   location ~ (^|/)\. {
       return 403;
   }

   location / {

rewrite ^/city/restaurants$ /city/listings/restaurants last;

    location ~* \.php$ {
                            include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                            #fastcgi_pass unix:/var/run/php5-fpm.sock;
                            fastcgi_pass 127.0.0.1:9000;
                            #try_files $uri @rewrite;
                            }
                    try_files $uri @rewrite;
                    }

            location @rewrite {
                    rewrite ^ /index.php;
            }
            location ~* \.(?:ico|css|js|gif|jpg|jpeg|png)$
            {
                    try_files $uri $uri/;
                    expires 30d;

             }
}
3
civilians

まず、locationブロックから外側のserverブロックにキー書き換えを移動します。それはあなたのロジックを簡素化します。

次に、 rewrite debug logging を取得して、取得している404が元のURLからのものか、書き換えられたURLからのものかを確認します。

最後に、根本的な原因がまだ見つからない場合 一般的なデバッグログを有効にする Nginxの場合:

error_log /path/to/log debug;
1
Mark Stosberg