Estou lutando com algumas reescritas do Nginx para argumentos de url passados para index.php:
- Velho:
?topic=10126.msg36887
- Novo:
?posts/36887/
Minhas duas perguntas:
1) Como faço para reescrever a nova estrutura de argumento, já que ela usa "parâmetro/valor/" em vez da estrutura tradicional "parâmetro=valor"?
2) Minha instrução "if" não está disparando e não consigo descobrir o porquê ... O URL de teste domain.com/forum/index.php?topic=10126.msg36887
deve redirecionar para /success
, mas não foi reescrito.
Aqui está minha configuração atual do Nginx:
location /forum/ {
index index.php index.html index.htm;
try_files $uri $uri/ /forum/index.php?$uri&$args;
location /forum/index.php {
# I know Nginx 'If is Evil', but it's the only way
# to trigger rewrites on url parameters
if ($arg_topic ~ [0-9]+\.\bmsg([0-9]+) {
# testing whether 'if' triggers:
rewrite ^ /success? redirect;
# full rewrite:
# rewrite ^\/forum\/index\.php ^\/forum\/index\.php\?posts\/$1\/? redirect;
}
}
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Colocar isso no
server
bloco de configuração deve funcionar: o regexp deve corresponder ao que você precisa corretamente e, guardando o ID necessário em uma variável, você pode usá-lo posteriormente na reescrita.Supondo que você não tenha um argumento de 'tópico' em outras partes do site, não há realmente nenhuma necessidade de definir isso em um local - mesmo se o fizer, você pode alterar a primeira parte da reescrita para corresponder a /forum/index .php apenas.
Se for apenas sobre o argumento 'tópico', isso pode funcionar:
No nível 'http' do seu nginx.conf, declare o seguinte 'mapa':
No nível do 'servidor', adicione o 'local' apropriado:
Certifique-se de ter especificado a diretiva 'root' no nível do servidor para que 'SCRIPT_FILENAME' seja preenchido com o valor correto.
Além disso, você pode verificar se '$topic_id' é zero (por exemplo, topic_id= está faltando ou tem valor incorreto).
Usando isso, sua matriz '$_GET' conterá algo como: