Назад | Перейти на главную страницу

Преобразование Apache в Nginx (новичок)

У меня есть установка веб-сервера Nginx с PHP, и я хочу перейти на Nginx, и я хочу преобразовать эти правила .htaccess в файл nginx.conf:

RewriteRule ^blog(|/)$ /data/core/site/blog.php
RewriteRule ^blog/post(|/)$ /data/core/site/blogpost.php

Пока вот что у меня есть:

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

Однако, если я захожу на страницу (http://example.com/blog), Он дает мне файл для загрузки, я хочу, чтобы он сервер PHP и отображал контент, как мне это исправить?

Полная конфигурация Nginx: (с использованием пакета Winginx в Windows):

server {
    listen 127.0.0.1:80;
    server_name localhost;

    root home/localhost/public_html;

    index index.php;

    log_not_found off;
    #access_log logs/localhost-access.log;

    charset utf-8;

    location ~ /\. { deny all; }
    location = /favicon.ico { }
    location = /robots.txt { }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

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

Обработка запросов

Главное правило, которое следует запомнить: nginx обслуживает запрос с одним местоположением (можно выделить еще больше: и только одно место).

Читать: http://nginx.org/en/docs/http/request_processing.html

location соответствие

Читать: location документация

В зависимости от вашей конфигурации nginx сначала будет соответствовать /blog префикс место, затем на \.php$ регулярное выражение местоположение и в конечном итоге обслужит запрос с последним. С предоставленной вами конфигурацией скрипт больше не должен загружаться как необработанный файл, а должен быть отправлен на PHP.

Однако это не означает, что ваша конфигурация верна: запрос не обслуживается вашим /blog место, которое на данный момент бесполезно.

  1. Это хорошая практика - избегать фильтрации запросов с местоположениями регулярных выражений, которые основаны на порядке, что плохо (помните, директивы Apache кошмар чувствительности порядка?). Для фильтрации используйте префиксы местоположений, основанные на самом длинном совпадении. Вы можете встроить местоположения друг в друга, если вам в конечном итоге понадобится регулярное выражение.
  2. Почему бы не поставить прямо fastcgi* директивы в /blog расположение? Тогда вместо использования $fastcgi_script_name переменная (угадывается из location совпадение, которое будет вариантами /blog здесь), вы можете использовать fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php. Кстати, $fastcgi_script_filename уже содержал стартовый /, не нужно добавлять единицу между переменными
  3. Избегайте использования перенаправлений, если вы можете их избежать. Избегайте особенно rewrite даже больше. Простые перенаправления пользователей (переписывание URL-адресов посредством уведомлений о перенаправлении, отправленных клиенту с кодами состояния HTTP) могут быть выполнены с помощью return. То, что вы здесь сделали, было внутренним перенаправлением (выполнялось локально на сервере): его единственное использование заключалось в изменении URI, который затем использовался для SCRIPT_FILENAME параметр.

Для начала можно использовать:

location /blog {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php;
    include fastcgi_params;

    # Useless here since SCRIPT_FILENAME will never be a directory indeed
    fastcgi_index index.php;

    location /blog/post {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_param SCRIPT_FILENAME $document_root/data/core/blogpost.php;
        include fastcgi_params;
    }
}

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

server {
listen 127.0.0.1:80;
server_name virjox www.virjox;

root home/virjox/public_html;

index index.php;

log_not_found off;
#access_log logs/virjox-access.log;

charset utf-8;

sendfile on;

location ~ /\. { deny all; }
location = /favicon.ico { }
location = /robots.txt { }  
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
    rewrite ^/(.*)\.html /$1\.php;
}
   location /blog {
     rewrite ^/blog(|/)$ /data/core/blog.php;
   }
}

и это отлично работает.