2017-08-08 5 views
1

Ich habe muy tiempo auf diese und ich kann keine Lösung erhalten. Ich brauche eine Möglichkeit, die gleiche URL, aber mit anderen Stammverzeichnis auf die gleiche Anwendung zeigen. Ich möchte keine Umschreibungen verwenden, da der Name der Root-Adresse von der Anwendung verarbeitet und überschrieben werden muss.Nginx-Aliase und dynamische Verzeichnisnamen

http://www.host.com/a/ --> /var/www/html/project/ 
http://www.host.com/b/ --> /var/www/html/project/ 
http://www.host.com/c/ --> /var/www/html/project/ 

Ich habe es geschafft, in nginx ein Alias ​​Verzeichnis mit einem festen Namen vdirectory und machen nginx das Ersuchen an fastcgi zu konfigurieren.

location /vdirectory { 

     alias /var/www/html/project/; 
     try_files $uri $uri/ /vdirectory/index.php; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
     } 
} 

Das obige funktioniert OK.

Da will ich nicht fest Root-Verzeichnis Namen, sondern willkürlich diejenigen verwenden, das ist, was ich bisher geschaffen habe:

location ~ ^/(.?)$ { 

     alias /var/www/html/project/; 
     try_files $uri $uri/ /$1/index.php; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
     } 
} 

Unnötig zu sagen, es gibt 404. Es ist ein gutes Zeichen, weil es bedeutet, dass Regex den Pfad erkannt hat, aber die Anfrage nicht korrekt weitergeleitet wird.

Der einzige Unterschied zwischen den Arbeits config und der falschen ist /vdirectory vs ~ ^/(.?)$

Antwort

2

alias funktioniert anders als in einem regulären Ausdruck location Block. Siehe this document für Details. Sie müssen den Rest des URI erfassen und an den Wert alias anhängen. Zum Beispiel:

location ~ ^/(?<prefix>[^/]+)/(?<name>.*)$ { 
    alias /var/www/html/project/$name; 

    if (!-e $request_filename) { rewrite^/$prefix/index.php last; } 

    location ~ \.php$ { 
     if (!-f $request_filename) { return 404; } 

     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     include fastcgi_params;      
     fastcgi_param SCRIPT_FILENAME $request_filename; 
    } 
} 

Ich vermeide mit try_files und alias innerhalb des gleichen Blocks aufgrund long term issues. Siehe this caution über die Verwendung von if.

+0

Ja. Das habe ich gesucht. Es ist so selten, eine so präzise Lösung zu bekommen. Tausend Dank –

Verwandte Themen