Хост Стейси на сервере nginx? (конвертировать.htaccess в nginx)

Стейси - легкая система управления контентом. Я использую его на своем веб-сайте porfolio, однако он использует файл.htaccess для создания дружественных URL. Можно ли переписать эти строки.htaccess для использования в nginx? Вот содержимое файла.htaccess;

RewriteEngine on

# Some hosts require a rewritebase rule, if so, uncomment the RewriteBase line below. If      you are running from a subdirectory, your rewritebase should match the name of the path to    where stacey is stored.
# ie. if in a folder named 'stacey', RewriteBase /stacey
#RewriteBase /

ErrorDocument 404 /404.html

# Rewrite any calls to *.html, *.json, *.xml, *.atom, *.rss, *.rdf or *.txt if a folder      matching * exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !public/
RewriteCond %{DOCUMENT_ROOT}/public/$1.$2 !-f
RewriteRule (.+)\.(html|json|xml|atom|rss|rdf|txt)$ $1/ [L]

# Add a trailing slash to directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.|\?)
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ([^/]+)$ $1/ [L]

# Rewrite any calls to /render to the image parser
RewriteCond %{REQUEST_URI} render/
RewriteRule ^render/. app/parsers/slir/ [L]

# Rewrite any calls to /* or /app to the index.php file
RewriteCond %{REQUEST_URI} /app/$
RewriteRule ^app/ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ index.php?/$1/ [L,QSA]

# Rewrite any file calls to the public directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !public/
RewriteRule ^(.+)$ public/$1 [L]`

Заранее спасибо!


Я достиг некоторого прогресса. Вот;

location / {
if ($uri ~ "/app/$"){
rewrite ^/app/ /index.php last;
}

if (!-e $request_filename){
rewrite ^/(.*)/$ /index.php?$1 last;
}

if (!-f $request_filename) {
rewrite ^/(?!public/)(.+);
}

if (!-f $request_filename) {
rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $1/ last;
}

if (!-e $request_filename) {
rewrite ^/(?!public/)(.+)$ public/$1 last;
}

Это переписать все проекты без проблем прямо сейчас. Например;

domain.com/?/projects/project-name-3/ стал domain.com/projects/project-name-3/

но есть и еще 2 страницы. один из них "о" и один из "связаться со мной" . они также стали; domain.com/about и domain.com/contact-me, но когда я нажимаю на них, страница загружается, но без CSS-стиля. какая-нибудь подсказка?


хорошо, новый код такой, и он дает мне ошибку; nginx: [emerg] неверное количество аргументов в директиве "переписать" в /etc/nginx/sites-enabled/domain.com:21

location / {
rewrite ^/app/ /index.php last;
}
if (!-e $request_filename){
rewrite ^/(.*)/$ /index.php?$1 last;
}

if (!-f $request_filename) {
rewrite ^/(?!public/)(.+);
}

if (!-f $request_filename) {
    rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $2/ last;
}

try_files /public$uri /public$uri/ $uri $uri/ /index.php;
}

код в 21 строке;

rewrite ^/(?!public/)(.+);

3 ответа

Недавно я перенес некоторые сайты Stacey в Nginx, используя эту конфигурацию:

server {

        root SERVER FILE LOCATION;
        index index.php index.html index.htm;

        # Make site accessible from
        server_name YOUR IP OR DOMAIN NAME;

        location / {
        # Stacey Rules
        error_page 404 /404.html;

        # Rewrite any calls to /render to the image parser
        rewrite ^/render/. /app/parsers/slir/ break;

        # Rewrite any file calls to the public directory
        try_files $uri $uri/ /index.php?$uri;
        }

        # Block access to .htaccess files
        location ~ /\.ht {
        deny  all;
        }

        include /usr/local/nginx/conf/staticfiles.conf;
        include /usr/local/nginx/conf/php.conf;
}

Примечание: включаемые файлы являются просто стандартными ссылками на страницы ошибок и конфигурацией PHP (Fast-cgi php-fpm), которую я собрал, чтобы сохранить повторение одной и той же вещи в нескольких установках сайта.

Через https://github.com/kolber/stacey/issues/143

Вы большую часть пути там.

Три из пяти rewrite s можно заменить на nginx гораздо быстрее и проще try_files директивы. Можно немного упростить. Пятый имеет логическую ошибку, как указано в вашем вопросе.

  1. Во-первых, вам не нужно помещать этот чек в if так как он содержит свой собственный шаблон сопоставления.

    location / {
        rewrite ^/app/ /index.php last;
    

    Это также может быть размещено в своем собственном location блокировать, но оставить это на потом...

  2. Во-вторых, ваша логическая ошибка. Когда вы переписали это правило, вы изменили два () шаблон соответствует трем, но не отрегулировал обратную ссылку $1 в $2 для учета его измененной позиции в новом регулярном выражении.

        if (!-f $request_filename) {
            rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $2/ last;
        }
    
  3. В заключение, try_files, Для очень простых матчей это намного быстрее, чем rewrite а также легче понять. Так...

        try_files /public$uri /public$uri/ $uri $uri/ /index.php;
    }
    

Это должно помочь вам в 99% случаев, за исключением последних изменений, основанных на информации, не имеющей отношения к вашему вопросу.

Я использую Stacey CMS, вот что я использую для конфигурации Nginx вместо Apache:

server {

    listen 80;
    server_name localhost;
    root /home/vagrant/test;
    index index.php index.html index.htm;
    error_page 404 /404.html;

    location / {
      if ($query_string != "") {
        return 301 $scheme://$http_host$query_string;
      }
      try_files $uri $uri/ /index.php?$uri;
    }

    location ~ \.php$ {
        try_files $uri =403;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

если if блок определенно не идеален или идиоматичен с конфигами nginx. Здесь необходимо работать со Стейси Тхо.

Другие вопросы по тегам