[nginx] редирект для несуществующих *.php на index.php

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем latteo, 18 мар 2014.

  1. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    Код:
    location / {
      if (!-e $request_filename){
        rewrite ^/(.*)$ /index.php?q=$1;
      }
    }
    
    	location ~ \.php$ {
    		fastcgi_pass 127.0.0.1:9000;
    		fastcgi_index index.php;
    		fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    		include fastcgi_params;
    	}
    Если запросить url http://test.com/loading.ajax.php то не смотря на то, что файл такой не существует, rewrite не срабатывает и запрос сразу идёт на php. Как это пофиксить?
     
  2. Doctor_zlo

    Doctor_zlo

    Moderator
    Регистр.:
    25 апр 2008
    Сообщения:
    461
    Симпатии:
    978
    Может??
    Код:
      rewrite ^/(.*)$ /index.php?q=$1 last;
     
  3. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    посмотри документацию по try_files. В частности попробуй
    Код:
    location ~ \.php$ {
                    try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
            include fastcgi_params;
        }
    (Не помню если 404 выводит в данном случае страницу nginx, или передает к индексу)
     
  4. Doctor_zlo

    Doctor_zlo

    Moderator
    Регистр.:
    25 апр 2008
    Сообщения:
    461
    Симпатии:
    978
    По идее вот этот участок кода,
    Код:
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
            include fastcgi_params;
        }
    перехватывает все *.php
    Поэтому ищет файл с названием loading.ajax.php
    Если попробовать прописать в саму секцию правила?
    вот так вроде заработало на тестовам серванте у мну
    Код:
        location ~ \.php$ {
      if (!-e $request_filename){
    rewrite ^/loading.ajax.php$ /index.php?q=$1 last;
    }
                  fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    ну или попробуй
    Код:
        location ~ \.php$ {
     if (!-e $request_filename){
      rewrite ^/(.*)$ /index.php?q=$1;
      }
                  fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
     
    Последнее редактирование: 18 мар 2014
    latteo нравится это.
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    Документацию и гугл я и без того пару часов читал и try_files мне приручить не удалось.

    Окончательный вариант, который сработал:
    Код:
      location / {
        if (!-e $request_filename){
          rewrite ^/(.*)$ /index.php?q=$1;
        }
      }
    
      location ~ \.php$ {
        if (!-e $request_filename){
          rewrite ^/(.*)$ /index.php?q=$1;
        }
        
    		fastcgi_pass 127.0.0.1:9000;
    		fastcgi_index index.php;
    		fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    		include fastcgi_params;
    	}
    
     
  6. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    Просто как пишут в на сайте nginx: http://wiki.nginx.org/IfIsEvil

    Попробуйте такой вариант (извиняюсь за бардак в конфиге, сайт в разработке:(
    Код:
    server {
        ....
    
        index app_dev.php;
    
        location / {
            autoindex off;
    ...
            index index.html index.php; ## Allow a static html file to be shown first
            try_files $uri $uri/ /app_dev.php?$query_string;
    ...
        }
        location  /. { ## Disable .htaccess and other hidden files
          return 404;
        }
    
        location ~ \.php$ { 
            try_files $uri /app_dev.php?$query_string =404;
            expires        off; ## Do not cache dynamic content
            #fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params; ## See /etc/nginx/fastcgi_params
        }
    }
    
    В вашем случае замените app_dev на страницу входа.
     
    latteo нравится это.