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

latteo

Эффективное использование PHP, MySQL
Регистрация
27 Фев 2008
Сообщения
1.603
Реакции
1.565
Код:
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 Для просмотра ссылки Войди или Зарегистрируйся то не смотря на то, что файл такой не существует, rewrite не срабатывает и запрос сразу идёт на php. Как это пофиксить?
 
посмотри документацию по 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, или передает к индексу)
 
Как это пофиксить?
По идее вот этот участок кода,
Код:
    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
Поэтому ищет файл с названием Для просмотра ссылки Войди или Зарегистрируйся
Если попробовать прописать в саму секцию правила?
вот так вроде заработало на тестовам серванте у мну
Код:
    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;
    }
}
 
Последнее редактирование:
посмотри документацию по try_files.
Документацию и гугл я и без того пару часов читал и 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;
	}
 
Документацию и гугл я и без того пару часов читал и try_files мне приручить не удалось.

...

Просто как пишут в на сайте nginx: Для просмотра ссылки Войди или Зарегистрируйся

Попробуйте такой вариант (извиняюсь за бардак в конфиге, сайт в разработке:(
Код:
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 на страницу входа.
 
Назад
Сверху