LINUX.ORG.RU
ФорумAdmin

Тупняк, mod_rewrite, htacces (apache) -> location (nginx)

 , , ,


0

1

Имеется:

Options +FollowSymLinks
Options -Indexes
DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt|public)
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L,QSA]

Если первые 3 строчки мне понятны, то с реврайтом нужна помощь. Сконвертил тут, получил:

location ~ \.(css|js|jpg|gif)$ {
}

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

Итого: index.php прогружается, при попытке перейти по любой ссылке получаю 404.

Еще крутится на серваке мой код без реврайта - он работает нормально, т.е. php прикручен правильно.

★★★★★

Так, походу косяк в php-fpm, потому что apache-mpm-worker+php-fpm тоже отказывались работать (Access denied), perfork+mod_php заработал сразу. Вечером буду ковырять php-fpm.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)
Ответ на: комментарий от visual

Немного поколупавшись, разобрался. Основное, что нужно для работоспособности движка:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L,QSA]

Кусок site из sites-enabled:

...
location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
}

location ~ \.(css|js|jpg|gif)$ {}

autoindex off;
location / {
                if (!-e $request_filename) {
                        rewrite ^(.*)$ /$1 last;
                }
        }
...

при

rewrite ^(.*)$ /$1 last;

получаем ошибку 500, кусок лога нгинкса:

*31 rewrite or internal redirection cycle while processing "////////////blahblahblah"

при

rewrite ^(.*)$ /$1 break;

получаем 404, файл не найден, в логе:

"<путь к движку>/<ссылка, полученая реврайтом>" failed (2: No such file or directory)

т.е. оно обрабатывает ссылку, обрезает ее в соответствии с правилами rewrite и пытается найти файл по этому пути, которого естественно нет.

Комбинации last; + break; не помогли.

Кстати, php-fpm и mpm-worker завелись, в php.ini требовалось cgi.fix_pathinfo=1 вместо «nginxовского» рекомендуемого 0.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)

Сделал так:

        location / {
                index index.php;
                try_files /index.php/$uri $uri;
#               if (!-e $request_filename) {
#                       rewrite ^(.+)$ /$1 last;
#               }
        }

Получилось:

*4 rewrite or internal redirection cycle while internally redirecting to "<url>", client: <IP>, server: <server>, request: "GET <url> HTTP/1.1", host: "<server>"

т.е. redirecting to «<url>» и request: «GET <url>...» совпадают.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.