Nginx reescrever, redefinir reescrever ou adicionar extensões a um diretório específico

2

Aqui está minha configuração do site nginx:

server {
server_name DOMAIN.COM;
access_log /srv/www/DOMAIN.COM/logs/access.log;
error_log /srv/www/DOMAIN.COM/logs/error.log;
root /srv/www/DOMAIN.COM/public_html;

location / {
    if ($request_uri ~ ^/(.*)\.html$) {  return 302 /$1;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
    index index.html index.htm index.php;
}

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /$1$is_args$args;  }
    try_files $uri =404;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

}

Como eu faria isso "domain.com/directory/" NÃO irá reescrever nenhum URL e manter as extensões de arquivo? Por exemplo, faça com que "domain.com/directory/filename" e todos os outros arquivos no diretório sejam reescritos para "domain.com/directory/filename.php", mas em todos os outros diretórios remova ".php".

    
por Miguel Renaud-Nolte 04.02.2016 / 23:39

1 resposta

1

Solução proposta (mostrando apenas os blocos de localização):

location ~ ./$ { rewrite ^(.*)/ $1 last; }

location / {
    if ($request_uri ~ ^(.*)\.(php|htm)) { return 302 $1$is_args$args; }

    try_files $uri $uri/index.html $uri/index.htm @php;
}

location @php {
    try_files $uri.php $uri/index.php =404;

    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass  127.0.0.1:9000;
}

location /somedirectory {
    rewrite ^(.*)\.php$ $1 break;

    try_files $uri $uri/index.html $uri/index.htm @php;
}

O bloco location ~ /$ remove silenciosamente qualquer barra final, pois isso interfere nas diretivas try_files mais tarde.

Observe que o bloco location ~ \.php$ foi removido para que .php URIs sejam processados pelo bloco location / .

O bloco location / redirecionará os URIs com uma extensão .html e .php (o que é consistente com os dois if de blocos da sua configuração original.

O bloco location / tenta vários URIs, incluindo a lista da diretiva index (exceto index.php , que é tratado posteriormente).

Observe que o elemento $uri/ e a diretiva index não são mais usados.

A ação final é invocar o bloco location @php nomeado para manipular os arquivos .php e index.php .

Até este ponto, a funcionalidade é semelhante à sua configuração existente.

O location /somedirectory modifica o comportamento de URIs abaixo de somedirectory . Ele permite que .php URIs mantenham sua extensão removendo-a silenciosamente antes da diretiva try_files .

    
por 05.02.2016 / 17:57

Tags