@MaKS_Ibl4

Как можно конвертировать .htaccess для работы в Nginx?

Здравствуйте.
Суть вопроса такова.
У меня сервер Nginx + php-fpm, я пытаюсь установить скрипт, он в принципе работает, но часть ссылок не работает.
.htaccess имеет такой вид:
AddType image/x-icon .ico
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
Options +FollowSymlinks
Options -Indexes

RewriteEngine on
#RewriteBase /
RewriteCond %{REQUEST_URI} \.(png|gif|ico|swf|jpe?g|js|css|ttf|svg|eot|woff|yml|xml|zip|txt|doc)$
RewriteRule ^(.*) $1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} \.(ini|ph.*)$
RewriteRule ^(.*) index.php [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L,QSA]
</IfModule>

<IfModule mod_php5.c> 
php_flag magic_quotes_gpc Off
</IfModule>


Nginx вот такой:
location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;

		if ($request_uri ~ "\.(png|gif|ico|swf|jpe?g|js|css|ttf|svg|eot|woff|yml|xml|zip|txt|doc)$"){
			rewrite ^/(.*) /$1 break;
		}
		if (!-e $request_filename){
			rewrite ^/(.*) /index.php;
		}

        location ~ [^/]\.php(/|$) {
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $document_root$fastcgi_script_name) {
                return  404;
            }

            fastcgi_pass    127.0.0.1:9002;
            fastcgi_index   index.php;
            include         /etc/nginx/fastcgi_params;
        }
    }


Я пытался конвертировать через winginx, но результата это не дало. Может кто то знает более мощные средства для ковертации или в целом поможет с этим вопросом?
  • Вопрос задан
  • 1655 просмотров
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Я знаю самое лучшее средство — мозг.

1. Прочитать и понять что делает .htaccess
2. Написать нужные строчки в конфиге nginx.

Читаем:
RewriteCond %{REQUEST_URI} \.(png|gif|ico|swf|jpe?g|js|css|ttf|svg|eot|woff|yml|xml|zip|txt|doc)$
RewriteRule ^(.*) $1 [QSA,L]

Понимаем, что статика должна просто отдаваться как есть без попытки обрабатывать её в PHP.
Пришем
location ~ \.(png|gif|ico|swf|jpe?g|js|css|ttf|svg|eot|woff|yml|xml|zip|txt|doc)$ {
  # ничего не нужно, просто отдаём файлы
}


Читаем
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} \.(ini|ph.*)$
RewriteRule ^(.*) index.php [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L,QSA]

Тут два разных условия.
Первое — если файла не существует, второе — если запросили файл закнчивающийся на .ini или .ph<что-то> (кстати, регулярка идиотская, т.к. под неё попадает слишком много, например my.physics.html).
При выполнении любого из них запрос должен быть передан в index.php.

Первое условие пишется стандартно
location / {
  try_files $uri /index.php;
}


Второе
# скорее всего нужно что-то типа \.(ini|php|phps|php4|php5)$
# или хотя бы \.(ini|ph\w*)$
location ~ \.(ini|ph.*)$ {
  rewrite ^ /index.php break;

  fastcgi_pass 127.0.0.1:9002;
  # и прочие fastcgi_*
}


Итого:
location / {
  try_files $uri /index.php;
}
location ~ \.(png|gif|ico|swf|jpe?g|js|css|ttf|svg|eot|woff|yml|xml|zip|txt|doc)$ {
  # ничего не нужно, просто отдаём файлы
}

location ~ \.(ini|ph.*)$ {
  rewrite ^ /index.php break;

  fastcgi_pass 127.0.0.1:9002;
  # и прочие fastcgi_*
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы