nginx reescreve regex para versionamento de API

3

O que eu quero é que o primeiro seja transformado no segundo ...

/widget              => /widget/index.php
/widget/             => /widget/index.php
/widget?act=list     => /widget/index.php?act=list
/widget/?act=list    => /widget/index.php?act=list
/widget/list         => /widget/index.php?act=list
/widget/v2?act=list  => /widget/v2.php?act=list
/widget/v2/?act=list => /widget/v2.php?act=list
/widget/v2/list      => /widget/v2.php?act=list

v2 também pode ser v45, basicamente "v \ d +"
ato, "lista" neste caso, pode ter muitos valores e mais serão adicionados.
Quaisquer parâmetros de consulta adicionais seriam apenas passados com $ args, eu acho.

Basicamente, URLs que não especificam a versão irão para index.php, que pode então decidir qual arquivo de versão específico incluir. O que eu tenho medo de acontecer são loops - isso deve ficar em

location /widget {

certo?.

(Quanto a colocar a versão da API no URL, não estou tentando ser RESTful e o público-alvo é pequeno)

Recursos sobre como fazer isso inteiramente em index.php usando "routers" também são bem vindos: - /

    
por MSpreij 13.08.2014 / 23:10

2 respostas

3

Com três regras, você pode corresponder aos casos de exemplo e às seguintes versões dos widgets:

rewrite ^\/widget\/(v\d+)\/?(\?act=)?(.*)$ /widget/$1.php?act=$2 last;
rewrite ^\/widget\/?$ /widget/index.php last;
rewrite ^\/widget\/?(\?act=)?(.*) /widget/index.php?act=$2 last;

Eu escrevi isso usando um testador de regexp online, mas não configurei um ambiente de teste com o Nginx.

A primeira regra corresponderá a todos os casos com um número de versão, cobrindo com ou sem barra e com ou sem o argumento? act.

A segunda regra cobrirá a chamada básica do widget sem nenhum argumento, novamente com e sem barra final.

A última regra abrangerá todas as chamadas de widget sem versão, cobrindo com ou sem barra e com ou sem o argumento ?act .

A ordem de duas últimas regras é importante.

    
por 24.08.2014 / 00:02
2
server {
    ...
    rewrite ^/widget$                   /widget/index.php           last;
    rewrite ^/widget/$                  /widget/index.php           last;
    rewrite ^/widget\?act=list$         /widget/index.php?act=list  last;
    rewrite ^/widget/\?act=list$        /widget/index.php?act=list  last;
    rewrite ^/widget/list$              /widget/index.php?act=list  last;
    rewrite ^/widget/v(\d+)\?act=list$  /widget/v$1.php?act=list    last;
    rewrite ^/widget/v(\d+)/\?act=list$ /widget/v$1.php?act=list    last;
    rewrite ^/widget/v(\d+)/list$       /widget/v$1.php?act=list    last;
    ...
    location /widget {
        ...
    }
}

Para corresponder aos dígitos, você precisa de um grupo de captura () , este é um conceito de expressão regular.
O grupo de captura é referenciado na reescrita como $1 , que significa 'referência anterior'

Embora eu não saiba se isso vai ser uma lista sustentável para você.
Por exemplo, em vez de capturar ?act=list , por que não capturar tudo e adicioná-lo novamente à regra de regravação da seguinte forma:

rewrite ^/widget(.*)         /widget/index.php?$1  last;

Não tenho 100% de certeza sobre a aparência dos seus URLs antes da regravação, por isso não posso fornecer uma regra abrangente para isso.

    
por 18.08.2014 / 15:14