Como obter o equivalente do alias do Apache “/ foo” / caminho / para / foo trabalhando no nginx

3

Estou tentando configurar o nginx na frente do HHVM para exibir uma API que tenha uma página de entrada listando as versões disponíveis em / e as versões reais da API instalada em / api / [version] /.

Minha configuração do nginx até agora é a seguinte:

server {
    listen *:80;
    server_name api.domain.com;

    # Character Set
    charset utf-8;

    # Logs
    access_log /www/vhosts/api.domain.com/logs/access_log.nginx;
    error_log /www/vhosts/api.domain.com/logs/error_log.nginx;

    # Directory Indices
    index index.php;

    # Document Root
    root /www/vhosts/api.domain.com/public;

    # Location
    location /assets {
        try_files $uri $uri/ =404;
    }
    location /api/1.0 {
        root /www/vhosts/api.domain.com/api/1.0/public;
        rewrite ^/api/1.0(.*)$ /index.php$1;
        try_files $uri $uri/ /index.php?$query_string;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

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

    # Error Pages
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

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

    # Block access to .htaccess
    location ~ \.ht {
        deny all;
    }
}

As solicitações para http://api.domain.com/ são exibidas corretamente na página de destino. No entanto, as solicitações para http://api.domain.com/api/1.0/foo ainda são enviadas para o index.php em /www/vhosts/api.domain.com/public/index.php , em vez de para /www/vhosts/api.domain.com/api/1.0/public/index.php .

Alguém sabe como posso resolver este problema? A configuração do Apache que estou mudando está abaixo para referência:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName api.domain.com

    DocumentRoot /www/vhosts/api.domain.com/public/
    <Directory /www/vhosts/api.domain.com/public/>
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog /www/vhosts/api.domain.com/logs/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /www/vhosts/api.domain.com/logs/access.log combined
    ServerSignature Off

    Alias /api/1.0 "/www/vhosts/api.domain.com/api/1.0/public/"
    <Directory /www/vhosts/api.domain.com/api/1.0/public/>
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    Alias /api/latest "/www/vhosts/api.domain.com/api/1.0/public/"

    SetEnv APPLICATION_ENV testing
</VirtualHost>

Em uma nota não relacionada, alguém pode marcar isso com hhvm para mim? Eu preciso de pelo menos 300 reputação para criar a tag, e aparentemente ninguém nunca fez nenhuma pergunta relacionada a hhvm aqui ainda. : /

EDITAR:

De acordo com a sugestão do krisFR abaixo, tentei modificar o bloco location /api/1.0 da seguinte forma:

    location /api/1.0 {
        alias /www/vhosts/api.domain.com/api/1.0/public;
        try_files $uri $uri/ /index.php?$query_string;
    }

No entanto, isso carrega o código de /www/vhosts/api.domain.com/public/index.php em vez do código que eu quero carregar em /www/vhosts/api.domain.com/api/1.0/public/index.php . Alguma idéia adicional?

    
por Benjamin Nolan 05.08.2014 / 18:42

2 respostas

1

Fonte link

Este é um longo bug permanente no nginx . Mas você pode contornar usando a diretiva raiz novamente. Um tipo de hack, mas pelo menos funciona.

Ao mesmo tempo, adiciono barras às diretivas de locais.

location /api/1.0/ {
    root /www/vhosts/api.domain.com/api/1.0/public/;
    try_files $uri $uri/ /index.php?$query_string;
}
    
por 24.06.2017 / 15:15
0

O NGinx também tem uma diretiva alias .

Experimente:

location /api/1.0/ {
    alias /www/vhosts/api.domain.com/api/1.0/public/;
    ...
}

Editar:

Você pode tentar isso:

location ^~ /api/1.0/ {
    alias /www/vhosts/api.domain.com/api/1.0/public/;
    ...
}
    
por 05.08.2014 / 19:13

Tags