1 votes

Nginx réécrit la racine vers un sous-dossier sans changer la racine du serveur

J'essaie de déplacer une ancienne application d'apache à nginx mais j'ai bloqué ici.

En /.htaccess

RewriteEngine on
RewriteRule ^(.*) public/$1 [L]

En /public/.htaccess

Options +Indexes +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

La structure est vraiment simple. Cette application a

./application
    ./*back-end*
./vendor 
    ./*back-end includes*
./public 
    ./public/.htaccess <- this one
    ./*front-end*
./tests
./.htaccess <- this one

La seule façon de le faire fonctionner était de changer le serveur. root à ./public et a ajouté

location / {
    if (!-d $request_filename){ set $rule_0 1$rule_0; }
    if (!-f $request_filename){ set $rule_0 2$rule_0; }
    if ($request_filename !~ "-l"){ set $rule_0 3$rule_0; }
    if ($rule_0 = "321"){ 
        rewrite ^/(.+)$ /index.php?url=$1 last; 
    }
} #from winginx convertor

mais de cette façon mon extérieur de ./public Les dossiers sont laissés de côté et l'application est cassée. Je cherche donc un moyen de la réécrire sans exclure les dossiers du back-end.

1voto

HugoFS Points 313

Réinitialisation de votre document root retour au début . Essayez ceci :

location / {
    try_files $uri $uri/ @public;
}
location @public {
    rewrite ^ /public$request_uri last;
}
location /public {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /public/index.php?url=$1 last;
}

Les premier et deuxième blocs d'emplacement serviront les fichiers de base et veilleront à ce que tout le reste soit réécrit dans le bloc d'emplacement de l'utilisateur. /public (votre premier .htaccess ensemble de règles).

Les troisième et quatrième blocs d'emplacement serviront les fichiers du dossier public (s'ils existent) et, dans le cas contraire, invoqueront la commande /public/index.php script.

Je présume que vous avez déjà un Bloc de localisation PHP .

Ce qui précède peut être excessif (je ne fais que suivre votre implémentation d'Apache), et ceci peut également fonctionner (en sautant quelques étapes) :

location / {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /public/index.php?url=$1 last;
}

Si vous ne voyez pas d'inconvénient à ce qu'il y ait une barre oblique dans l'adresse de l'utilisateur. url on peut le simplifier comme suit :

location / {
    try_files $uri $uri/ /public/index.php?url=$uri;
}

Voir este y este pour plus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X