Адаптировать mod rewrite .htaccess в nginx

ZM2007

Гуру форума
Регистрация
16 Окт 2007
Сообщения
186
Реакции
81
Есть вот такенный бред в .htaccess его нужно переделать так, чтобы nginx это понимал и обрабатывал, онлайн конвертилка не помогает а разбираться некогда ибо нужно срочно.

RewriteCond %{REQUEST_FILENAME} \.(js|ico|gif|jpg|png|css|pdf)$ [OR]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Хелп плз.
 
ну гдето так
можно конечно еще явно задать статик файлы (js|ico|gif|jpg|png|css|pdf)
чтобы при их отсутствии нжинкс отдавал 404, но это уже как вам больше нравится

Код:
server {
    listen 80;
    server_name example.com
 
    root /var/www
 
    location / {
        index index.php;
        try_files $uri $uri/ @handler;
    }
    location @handler {
        rewrite / /index.php;
    }
    location ~ .php$ {
        if (!-e $request_filename) { rewrite / /index.php last; }
        ... обработчик пхп
    }
}
 
Дабы не плодить... помогите, плз, вот такое переделать в конфигурацию nginx

Код:
RewriteRule ^(.*)$  index.php?where=$1&%{QUERY_STRING} [L]

то, что дали генераторы не помогло, одно, чего смог добиться - серв предлагает открыть или сохранить файл

для обработки пхп панелька пишет вот такие вот вещи
Код:
        location ~ \.php$ {
            try_files /c29ebf3cb148a92af9241c1581490c93.htm @php;
        }
 
        location @php {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass 127.0.0.1:9012;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            #fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_intercept_errors on;
        }
 
SkiLLer, попробуй в эту сторону посмотреть (первую строчку заменить и добавить отдельный location, в котором QUERY_STRING переопределить:(
Код:
location @php {
  try_files $uri @addwhere;
  ... остальное оставляем
}
 
location @addwhere {
  fastcgi_param SCRIPT_FILENAME $document_root/index.php;
  fastcgi_param QUERY_STRING where=$uri&$query_string;
  fastcgi_param REQUEST_METHOD $request_method;
  ... 
}
 
SkiLLer, попробуй в эту сторону посмотреть (первую строчку заменить и добавить отдельный location, в котором QUERY_STRING переопределить:(

все равно пытается сохранить файл, вот полный конфиг, который сгенерила панель плюс ваш код


server {
listen *:80;


server_name site.ru Для просмотра ссылки Войди или Зарегистрируйся

root /var/www/site.ru/web;



index index.html index.htm index.php index.cgi index.pl index.xhtml;



error_log /var/log/ispconfig/httpd/site.ru/error.log;
access_log /var/log/ispconfig/httpd/site.ru/access.log combined;

## Disable .htaccess and other hidden files
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}


location / {
rewrite ^(.*)$ /index.php?where=$1&$query_string break;
}

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location /stats {

index index.html index.php;
auth_basic "Members Only";
auth_basic_user_file /var/www/clients/client2/web3/web/stats/.htpasswd_stats;
}

location ^~ /awstats-icon {
alias /usr/share/awstats/icon;
}

location ~ \.php$ {
try_files /c29ebf3cb148a92af9241c1581490c93.htm @php;
}

location @php {
# try_files $uri =404;
try_files $uri @addwhere;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9012;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_intercept_errors on;
}


location @addwhere {
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param QUERY_STRING where=$uri&$query_string;
fastcgi_param REQUEST_METHOD $request_method;
}

location ~ .php$ {
rewrite / /index.php last;
}

}
 
location / {
rewrite ^(.*)$ /index.php?where=$1&$query_string break;
}
Не уверен, что это панель сгенерировала.
Часть правил "пересекаются"
К тому же не совсем понимаю назначение отдельных правил - это, например: c29ebf3cb148a92af9241c1581490c93

А "плюсовать" простым дописыванием - не очень удачная идея.

все равно пытается сохранить файл,
файл-то хоть нужный?
В @addwhere добавить
Код:
fastcgi_pass 127.0.0.1:9012;
 
Помогите плиз адаптировать mod_rewrite в nginx
Код:
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

RewriteRule ^(.*),(.*)$ $2.php?rewrite_params=$1&page_url=$2

RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]

Все генераторы выдают разный код, который не работает
 
Вот и я под утро уже с не соображающей башкой сюда загляну =)

Имеем следующей .htaccess
Код:
cat .htaccess
# redirect www to non-www
#RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
#RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteEngine On
#RewriteRule . - [E=no-gzip:1]
RewriteBase /
RewriteCond %{REQUEST_URI} ^(.+)\~s$
RewriteRule ^(.*) stats.php?u=$1 [L]
RewriteCond %{REQUEST_URI} ^(.+)\~d$
RewriteRule ^(.*) delete_file.php?u=$1 [QSA,L]
RewriteCond %{REQUEST_URI} ^(.+)\~i$
RewriteRule ^(.*) share_file.php?u=$1 [QSA,L]
RewriteCond %{REQUEST_URI} ^(.+)\~f$
RewriteRule ^(.*) view_folder.php?f=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !\.html$
RewriteRule ^(.*) file_download.php?u=$1 [QSA,L]

RewriteRule ^(.*).html$ $1.php [QSA,L]

Вот что наваял:

Код:
cat test.domain.lo.conf
server {
        listen      80;
        server_name  test.domain.lo www.test.domain.lo;
        access_log  /var/log/nginx/test-access.log;
        error_log  /var/log/nginx/test-error.log;

        root /var/www/vhosts/test.domain.lo;
        index index.php index.html index.htm;

        client_max_body_size 5G;
        client_header_timeout  3m;
        client_body_timeout 3m;
        send_timeout    3m;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass    unix:/var/run/php/fcgi;
            fastcgi_index  index.php;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        }
location / {

  #Statistics Url
  if ($request_uri ~ "^(.+)\~s$"){
    rewrite ^/(.*) /stats.php?u=$1;
  }

  #Delete File Url
  if ($request_uri ~ "^(.+)\~d$"){
    rewrite ^/(.*) /delete_file.php?u=$1;
  }

  #Public Info Page
  if ($request_uri ~ "^(.+)\~i$"){
    rewrite ^/(.*) /share_file.php?u=$1;
  }

  #Share Folder
  if ($request_uri ~ "^(.+)\~f$"){
    rewrite ^/(.*) /view_folder.php?f=$1;
  }

  #Download File
  if (!-e $request_filename){
    rewrite ^/(.*) /file_download.php?u=$1;
  }
  rewrite ^/(.*).html$ /$1.php;
}

}

Обращении на любую html качает php код =(

Установлен Nginx версии:
Код:
Installed Packages
nginx.x86_64                       1.0.15-5.el6                        @epel
 
Вот и я под утро уже с не соображающей башкой сюда загляну =)

Имеем следующей .htaccess
Код:
cat .htaccess
# redirect www to non-www
#RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
#RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteEngine On
#RewriteRule . - [E=no-gzip:1]
RewriteBase /
RewriteCond %{REQUEST_URI} ^(.+)\~s$
RewriteRule ^(.*) stats.php?u=$1 [L]
RewriteCond %{REQUEST_URI} ^(.+)\~d$
RewriteRule ^(.*) delete_file.php?u=$1 [QSA,L]
RewriteCond %{REQUEST_URI} ^(.+)\~i$
RewriteRule ^(.*) share_file.php?u=$1 [QSA,L]
RewriteCond %{REQUEST_URI} ^(.+)\~f$
RewriteRule ^(.*) view_folder.php?f=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !\.html$
RewriteRule ^(.*) file_download.php?u=$1 [QSA,L]

RewriteRule ^(.*).html$ $1.php [QSA,L]

Вот что наваял:

Код:
cat test.domain.lo.conf
server {
        listen      80;
        server_name  test.domain.lo www.test.domain.lo;
        access_log  /var/log/nginx/test-access.log;
        error_log  /var/log/nginx/test-error.log;

        root /var/www/vhosts/test.domain.lo;
        index index.php index.html index.htm;

        client_max_body_size 5G;
        client_header_timeout  3m;
        client_body_timeout 3m;
        send_timeout    3m;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass    unix:/var/run/php/fcgi;
            fastcgi_index  index.php;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        }
location / {

  #Statistics Url
  if ($request_uri ~ "^(.+)\~s$"){
    rewrite ^/(.*) /stats.php?u=$1;
  }

  #Delete File Url
  if ($request_uri ~ "^(.+)\~d$"){
    rewrite ^/(.*) /delete_file.php?u=$1;
  }

  #Public Info Page
  if ($request_uri ~ "^(.+)\~i$"){
    rewrite ^/(.*) /share_file.php?u=$1;
  }

  #Share Folder
  if ($request_uri ~ "^(.+)\~f$"){
    rewrite ^/(.*) /view_folder.php?f=$1;
  }

  #Download File
  if (!-e $request_filename){
    rewrite ^/(.*) /file_download.php?u=$1;
  }
  rewrite ^/(.*).html$ /$1.php;
}

}

Обращении на любую html качает php код =(

Установлен Nginx версии:
Код:
Installed Packages
nginx.x86_64                       1.0.15-5.el6                        @epel

Всем спасибо разобрался на свежую голову, все процедуры в разные локейшены взял и все заработало как надо.
 
Может кто то тоже поможет переделать .htaccess в nginx.conf


Код:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript application/json
</IfModule>

# Не даем IE войти в режим совместимости с IE7, даже когда он сам этого хочет
# github.com/rails/rails/commit/123eb25#commitcomment-118920
# Use ChromeFrame if it's installed for a better experience for the poor IE folk
<IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
                BrowserMatch MSIE ie
                Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
        </IfModule>
</IfModule>

<IfModule mod_setenvif.c>
BrowserMatch "MSIE" force-no-vary
BrowserMatch "Mozilla/4.[0-9]{2}" force-no-vary
</IfModule>

<IfModule mod_headers.c>
# указываем прокси-серверам передавать заголовок User-Agent
# для корректного распознавания сжатия
Header append Vary User-Agent env=!dont-vary
# запрещаем кэширование на уровне прокси-сервера для всех
# файлов, для которых у нас выставлено сжатие,
<FilesMatch .*\.(css|js|php|phtml|shtml|html|xml)$>
   Header append Cache-Control: "private, must-revalidate"
</FilesMatch>
</IfModule>

# Универсальный редирект с домена С www. на домен БEЗ www
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# всё что не касается файлов и не имеет точки в названии, добавлять в конце слеш
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)\.(.*){1,5}$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

# делает редирект для  *.php)
RewriteCond %{REQUEST_URI} ^(.*)\.php$
RewriteRule ^(.*)\.php$ $1\/ [L,R=301]

# убираем индексы
RewriteCond %{REQUEST_URI} ^(.*)index.php(.*)$
RewriteRule ^(.*)index.php(.*)$ $1$2 [L,R=301]

# site.ru/*/ открывает как site.ru/*.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)(\/)$ %{REQUEST_FILENAME}.php/ [L]

</IfModule>
 
Последнее редактирование модератором:
Назад
Сверху