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

преобразованный .htaccess в nginx нарушает мое приложение

Я работал над этим весь день, и мне до сих пор не везет. Я использовал онлайн-конвертер .htaccess для конфигурации, поэтому не думаю, что он все правильно преобразовал.

Ниже приведен мой файл .htaccess.

    RewriteCond     %{QUERY_STRING} ^$
    RewriteRule     ^((.)?)$        index.php?p=home [L]

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

    RewriteCond     $1 !^(\#(.)*|\?(.)*|\.htaccess(.)*|\.htaccess\.back(.)*|.idea\/(.)*|.svn\/(.)*|admin\.php(.)*|content\/(.)*|download\.php(.)*|ecc\/(.)*|images\/(.)*|index\.php(.)*|install\/(.)*|login\.php(.)*|readme\.txt(.)*|robots\.txt(.)*)
    RewriteRule     ^(.+)$ index.php?url=$1&%{QUERY_STRING} [L]

И моя преобразованная конфигурация nginx

try_files $uri $uri/ /index.php?url=$uri&$args;
location / {
   if ($query_string ~ "^$"){
    rewrite ^/((.)?)$ /index.php?p=home break;
  }
  if (-e $request_filename){
    rewrite ^(.*)$ /$1 break;
  }
  rewrite ^(.+)$ /index.php?url=$1&$query_string break;
}
location ~* (^(?!(?:(?!(php|inc)).)*/uploads/).*?(php)) {
                try_files $uri = 404;
                fastcgi_split_path_info ^(.+.php)(.*)$;
                fastcgi_pass unix:/tmp/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
}

Что происходит, когда я пытаюсь перейти по URL-адресу, например /admin.php?p=settings&group=3, он перенаправляет меня (потому что я считаю, что он не несет строку запроса) к имени входа. Когда я иду к чему-то вроде /index.php?p=login или /index.php?p=signup работает правильно.

Может ли кто-нибудь помочь мне в этом. -Джон

Я думаю, что вы делаете ошибку, пытаясь перевести htaccess в nginx conf. Эти два стиля конфигурации совершенно разные. Лучше попытаться реализовать логика вашего htaccess в nginx.

Итак, ваш htaccess делает следующее:

  1. Если запрос не содержит пути (только корень домена), перепишите запрос в /index.php?p=home
  2. Когда запрос является файлом, просто верните это
  3. Третий немного сложнее грок. Вы хотите переписать запрос на index.php? Url = &, за исключением некоторых запросов, которые вы хотите защитить, например .svn.

Итак, возможно, что-то вроде этого (непроверено):

# Block some bad requests [3], only included a few here to get the idea
location ~ (\.svn|\.htaccess|\.last|robots\.txt) {
    deny all;
}
location / {
    # see if a file or dir corresponding to the request exists and use that [2]
    try_files $uri $uri/ @rewrite;
}
# Rewrites [1] + [3]
location @rewrite {
    rewrite ^$ /index.php?p=home break;
    rewrite $(.*)$ /index.php?url=$1;
}
location ~ \.php$ {
    try_files $uri $uri/ /index.php?url=$uri&$args;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
}

Как я уже сказал, не тестировалось, но это больше похоже на nginx.