Перепишите все запросы на индексацию.php с nginx

в моей конфигурации Apache у меня есть следующее простое правило перезаписи, которое

  1. если файл не существует, будет переписан на индекс.в PHP
  2. на URL-адресах вы никогда не видите расширение файла (.в PHP)

Как я могу переписать это в nginx?

#
# Redirect all to index.php
#
RewriteEngine On

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} (/[^.]*|.)$ [NC]
RewriteRule .* index.php [L]

вот как выглядит мой серверный блок nginx, но он не работает : (

root /home/user/www;
index index.php;

# Make site accessible from http://localhost/
server_name some-domain.dev;


###############################################################
# exclude /favicon.ico from logs
location = /favicon.ico {
    log_not_found off;
    access_log off;
}   

##############################################################
# Disable logging for robots.txt
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}   

##############################################################
# Deny all attempts to access hidden files such as 
# .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /. {
    deny all;
    access_log off;
    log_not_found off;
}   

##############################################################
#   
location / { 
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php$args;
    fastcgi_pass    127.0.0.1:9000;
}   

###############################################################
# serve static files directly
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
    access_log off;
    expires    30d;
}   

###############################################################
# redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root html;
}   

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#   
location ~ .php$ {
    fastcgi_split_path_info ^(.+.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    # With php5-cgi alone:
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}

8 ответов


1 Если файл не существует, будет переписан на индекс.в PHP

добавьте в свой location ~ \.php$

try_files = $uri @missing;

это сначала попытается обслуживать файл, и если он не найден, он переместится в @missing часть. поэтому также добавьте следующее в свою конфигурацию (вне location block), Это перенаправит на вашу индексную страницу

location @missing {
    rewrite ^ $scheme://$host/index.php permanent;
}

2 на URL-адресах вы никогда не видите расширение файла (.в PHP)

для удаления php расширение читать следующим образом: http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/

и пример конфигурации из ссылки:

location / {
    set $page_to_view "/index.php";
    try_files $uri $uri/ @rewrites;
    root   /var/www/site;
    index  index.php index.html index.htm;
}

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/site$page_to_view;
}

# rewrites
location @rewrites {
    if ($uri ~* ^/([a-z]+)$) {
        set $page_to_view "/.php";
        rewrite ^/([a-z]+)$ /.php last;
    }
}

идеальное решение я попробовал его и успешно получить мою страницу индекса, когда я добавляю этот код в файл конфигурации моего сайта.

location / {
            try_files $uri $uri/ /index.php;
}

в самом файле конфигурации объяснил, что при "первой попытке обслуживать запрос как файл, затем как каталог, а затем вернуться к индексу.html в моем случае это индекс.php, поскольку я предоставляю страницу через php-код.


для передачи переменных get также используйте $args:

location / {
    try_files $uri $uri/ /index.php?$args;
}

плоская и простая конфигурация без перезаписи, может работать в некоторых случаях:

location / {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php;
}

используя nginx $is_args вместо ? Для получения строк запроса

location / { try_files $uri $uri/ /index.php$is_args$args; }

вот что сработало для меня, чтобы решить часть 1 этого вопроса:

    location / {
            rewrite ^([^.]*[^/])$ / permanent;
            try_files $uri $uri/ /index.php =404;
            include fastcgi_params;
            fastcgi_pass php5-fpm-sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
    }

переписать ^([^.]*[^/])$ 1$/ постоянный; перезаписывает адреса без файлов (адреса без расширений файлов), чтобы иметь "/" в конце. Я сделал это, потому что я столкнулся с "отказано в доступе"."сообщение, когда я попытался получить доступ к папке без него.

try_files $URI-адрес и $URI/ /индекс.php =404; заимствовано из ответа Санджуда, но с дополнительным 404 перенаправлением, если местонахождение до сих пор не найдено.

индекс fastcgi_index.на PHP; был последним кусочком головоломки, которого мне не хватало. Папка не переориентировалась на индекс.php без этой строки.


Если вы хотите передать только индекс.php (никакой другой файл php не будет передан fastcgi) в fastcgi, если у вас есть такие маршруты в рамках, как codeigniter

$route["/download.php"] = "controller/method";


location ~ index\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
}

вот ответ на ваш 2-й вопрос :

   location / {
        rewrite ^/(.*)$ /.php last;
}

это работа для меня (на основе моего опыта), означает, что все ваши blabla.php перепишет в blabla

как http://yourwebsite.com/index.php к http://yourwebsite.com/index