nginx Как перезаписать все URL-адреса, кроме нескольких с указанными расширениями?

Я пытаюсь преобразовать правила перезаписи из файлов .htaccess в конфигурацию nginx . как часть переноса сайта на веб-сервер NGINX .

вот правила перезаписи из .htaccess файла

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.jp?g$
RewriteCond %{REQUEST_URI} !\.png$
RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.js$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} !\.xhtml$
RewriteCond %{REQUEST_URI} !\.htm$
RewriteCond %{REQUEST_URI} !\.ico$

RewriteRule (.*) index.php [L]
RewriteRule (.*).html index.php [L]

моей текущей конфигурации nginx .

server {
    listen       80;
    server_name  example.com;

    root   /usr/share/nginx/html;

    location / {
        index  index.php index.html index.htm;
    }

    location ~ \.(php)$ {
        try_files $uri =404;
        root           /usr/share/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location !~* .(css|js|html|htm|xhtml|php|png|gif|ico|jpg|jpeg)$ {
      # Matches requests ending in png, gif, ico, jpg or jpeg. 
        rewrite ^(.*)$ /index.php break;
        rewrite (.*).html /index.php break;
    }

}

домашняя страница работает, но внутренние ссылки сайта дают 404.

до сих пор я пробовал много правил перезаписи, подобных этим.

if ( $uri  ~ ^/(?!(\.css|\.js|\.html|\.htm|\.xhtml|\.php|\.png|\.gif|\.ico|\.jpg|\.jpeg))) { 
    rewrite ^/(.*)$ /index.php break;
}

но иногда внутренняя ссылка работает, при перенаправлении всех статических файлов, таких как .css, .js, на домашнюю страницу , и иногда я не могу получить доступ к / administrator / моего сайта, он перенаправляет на домашнюю страницу.

как я могу реплицировать правила перезаписи .htaccess на nginx ?

1
задан 11 February 2017 в 15:40
1 ответ

На мой взгляд, это похоже на стандартный шаблон фронт-контроллера. В nginx это реализовано следующим образом:

server {
    listen       80;
    server_name  example.com;

    root   /usr/share/nginx/html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.(php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Логика заключается в том, что сначала он пытается определить, существует ли запрошенный ресурс в виде файла или каталога. Если он существует, он возвращается клиенту. В противном случае запрос передается в сценарий PHP, который затем определяет контент, который должен быть возвращен клиенту.

2
ответ дан 3 December 2019 в 20:28

Теги

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