
Ich habe eine Anwendung, die einige spezielle Bilder vorbereiten kann und die auf einem separaten Computer ausgeführt wird (ich versuche, sie als Bildserver zu verwenden).
Wenn diese Bilder von der Anwendung vorbereitet und bereitgestellt werden, werden sie auch psychisch in einem öffentlich zugänglichen Pfad wie /image/files/medium/562.jpg gespeichert, um zu verhindern, dass die Anwendung bei weiteren Anforderungen immer wieder ausgeführt wird.
Meine Anwendung implementiert das Front-Controller-Muster, daher muss ich eine entsprechende Anfrage an meine App senden /thumbnail/process/?qs=1&qs=2
oder /thumbnail.php
so etwas in der Art.
Außerdem muss ich die echte URL meines Miniaturbildprozessors vor Endbenutzern verbergen.
An dieser Stelle läuft es wie folgt ab:
- Der Endbenutzer stellt eine Bildanfrage wie
/picture/small/518.jpg
- Nginx erkennt es und schreibt es neu,
/image/files/small/518.jpg
da eigentlich keinpicture
Ordner vorhanden ist. - Wenn
/image/files/small/518.jpg
es vorhanden ist, sollte Nginx es direkt bereitstellen, anstatt die Anforderung an die App weiterzuleiten. - Wenn dies nicht der Fall ist (das Bild existiert nicht), muss nginx es erneut umschreiben (oder umleiten) und die Anfrage per benutzerdefinierter URI an die App weiterleiten, wie
/thumbnail/process/?size=small&model=866
- Außerdem sollte ngnix keine anderen Anfragen akzeptieren, wenn es sich nicht um eine Bildanfrage handelt, und sofort eine 444 zurückgeben.
Ich habe also versucht, diese Probleme zu lösen, indem ich benutzerdefinierte Regeln für nginx geschrieben habe, aber es funktioniert nicht. Es gibt kein Problem mit bereits verarbeiteten Bildern, aber es werden 404-Antworten „Nicht gefunden“ ausgegeben, anstatt die Anfrage an die Anwendung weiterzuleiten.
Ich kann nicht herausfinden, was an dieser Konfiguration falsch ist und was der Sinn ist, den ich übersehe.
server {
listen 127.0.0.1:80;
server_name image.mydomain.com;
root /var/www/public_html;
location / {
# I know if is evil.
# Don't pass request to the application if it's not a image request!
if ( $uri !~ ^/(image|picture|thumbnail)/(.*)$ ) {
return 444;
}
}
# Real request uri for image.
location ~ "^/picture/(small|medium|large)/([a-zA-Z0-9]).jpg$" {
set $size $1;
set $model $2;
rewrite ^ /image/files/$size/$model.jpg last;
}
location ~ "^/image/files/(small|medium|large)/([a-zA-Z0-9]).jpg$" {
try_files $uri /thumbnail/process/?size=$1&model=$2;
break;
}
location ~ ^/thumbnail/process/(.*)$ {
index index.php;
try_files $uri $uri/ /index.php?$args;
}
include fastcgi_config.conf;
}
Und Inhalt von fascgi_config.conf:
fastcgi_intercept_errors on;
location ~ .php$ {
fastcgi_pass my-www-pool;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
#fastcgi_param REQUEST_URI $uri?$args;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
fastcgi_param REDIRECT_STATUS 200;