2015-04-13 12 views
7

Sto scrivendo un semplice CMS in PHP. Pagine (file di riduzione dei prezzi) e le immagini sono accessibili come questo (rispettivamente):Nginx clean urls, come riscrivere una cartella come argomento con try_files

example.org/?q=about.md 
example.org/?i=photo.jpg 

Opzionalmente, vorrei utilizzare gli URL semplificati con Nginx, a rivolgere le medesime richieste simile a questa:

example.org/about 
example.org/photo.jpg 

Piuttosto uso try_files di if e rewrite ma dopo aver sperimentato per ore, non riesco a farlo funzionare.

location/{ 
    try_files $uri $uri/ /?q=$uri.md =404; 
} 

location ~ \.(gif|jpg|png)$ { 
    try_files $uri /?i=$uri =404; 
} 

Non capisco il motivo per cui il codice di cui sopra non funziona (gli URL con il lavoro argomento bene, ma quelle belle danno errori 404).

C'è qualcosa di sbagliato nel passare il nome della cartella come argomento usando $uri?
Devo sfuggire a qualche personaggio strano (a parte il mio padrone di casa)?


Per essere completo, eseguo Nginx 1.6.2, utilizzando lo standard nginx.conf. Ecco il resto del mio blocco del server:

server_name example.org; 
root /srv/example/; 
index index.html index.htm index.php; 

(...) 

location ~ \.php$ { 
    fastcgi_split_path_info ^(.+\.php)(/.+)$;  
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
    include fastcgi.conf; 
} 

e fastcgi.conf è di serie.

+0

È 'document_root' impostato correttamente? Si potrebbe provare '/index.php? Q = $ uri.md' nel' try_files', cioè indicare esplicitamente 'index.php', anche se penso che dovrebbe funzionare in questo modo. – Keelan

+0

Sono abbastanza sicuro che 'document_root' è a posto dato che gli url regolari/lunghi funzionano bene. Ho anche provato con '/index.php? Q = $ uri.md' ma non ha fatto la differenza. – wilks

risposta

3

sono stato in grado di ottenere il vostro esempio al lavoro, semplicemente omettendo il =404:

location/{ 
    try_files $uri $uri/ /?q=$uri.md; 
} 

location ~ \.(gif|jpg|png)$ { 
    try_files $uri /?i=$uri; 
} 

Citando the manual:

controlla l'esistenza del file nell'ordine specificato e utilizza il primo file trovato per l'elaborazione delle richieste; [...] Se nessuno dei file è stato trovato, viene eseguito un reindirizzamento interno allo uri specificato nell'ultimo parametro.

si desidera che la reindirizzamento interno, che sta avvenendo solo se nessuno dei file si trovano, ma =404 è sempre trovato.

+0

Ottimo, funziona perfettamente ora! E rileggendo la tua risposta, capisco persino la logica dietro di essa. Grazie – wilks

Problemi correlati