2013-04-18 5 views
0

Mon site est en cours d'exécution sur Nginx et je suis en train d'ajouter un logiciel dans le sous-répertoire du site qui utilise les règles de mod_rewrite d'Apache. Par exemple. www.mydomain.com/mySubfolderApache mod_rewrite aux règles de réécriture Nginx

Voici .htaccess Apache

#Options -Indexes 
<ifModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^/system.* 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.+)$ index.php?/$1 [L] 
</ifModule> 

Jusqu'à présent, je réussi à obtenir la page principale au travail, mais lorsque vous demandez la page de connexion, il est à l'origine d'une URL de redirection en boucle. Par exemple. www.myDomain.com/login Avec ceci:

location /mySubfolder { 
if (!-e $request_filename) { 
rewrite ^(.*)$ /mySubfolder/index.php?q=$1 last; 
break; 
} 
} 

J'ai lu et essayer d'apprendre comment convertir Apache Nginx et même utilisé le .htaccess convertisseur Nginx j'ai trouvé à http://winginx.com/htaccess mais l'outil n » t semble reconnaître la partie% {REQUEST_URI} ^/system. *. Lors de mes recherches et d'études, je suis venu avec:

location /mySubfolder { 
if ($request_uri ~ "^/(system.*)$") { 
rewrite ^/(.*)$ index.php?/$1 last; 
} 
if (!-e $request_filename) { 
rewrite ^(.+)$ /mySubfolder/index.php?q=$1 last; 
break; 
} 
} 

Je suis un noob complet à ce et je me demandais même si je suis même près de réaliser cette conversion au travail. S'il vous plaît aider.

Merci.

Répondre

2

se demandait même si je suis même près de réaliser cette conversion à travail

Vous avez essentiellement pris la mauvaise approche à utiliser dans Nginx.

Bien qu'il est un peu naturel de supposer que les règles de réécriture dans Apache seraient mis en correspondance avec la réécriture dans Nginx, ils ne sont pas. Au lieu de cela, ils sont principalement mappés sur les règles d'emplacement.

Votre bloc pour mySubfolder devrait ressembler à:

location ^/mySubfolder { 
    try_files /mySubfolder/index.php?$args =404; 
} 

Vous n'êtes pas réécrivez fait quoi que ce soit - vous dites simplement nginx que toute demande commençant par/mysubfolder doivent être servis par les fichiers répertoriés dans try_files. BTW vous devez dire à Nginx de passer la chaîne de requête à travers laquelle est ce que le args fait.

Vous pouvez ajouter l'URL d'origine (je pense) mais il peut être plus facile à utiliser juste $_SERVER['REQUEST_URI'] dans votre script.

Je crois que la règle de réécriture vous devez même commencer URI est à l'origine du/mysubfolder garder correspondant.

En ré-écriture Nginx est utilisé uniquement lorsque vous voulez faire les chemins d'URL externes servis par différents urls internes, et normalement la règle de réécriture est pas à l'intérieur d'un bloc d'emplacement.

Par exemple, j'ai un serveur de fichiers, qui sert des images et d'autres fichiers. Je ces règles de réécriture dans le bloc serveur:

rewrite ^/image/(\d+)/(\w+)/(.+)\.([^\.]*)$ /proxy/proxyImage.php?typeID=$1&mode=$2&imagePath=$3.$4&resizeAllowed=TRUE&type=image last; 
    rewrite ^/image/(\d+)/(.+)\.([^\.]*)$ /proxy/proxyImage.php?typeID=$1&imagePath=$2.$3&resizeAllowed=TRUE last; 
    rewrite ^/file/(\d+)/(.+)\.([^\.]*)$ /proxy/proxyFile.php?typeID=$1&imagePath=$2.$3&resizeAllowed=FALSE last; 

pour faire les URL externes belle apparence. Mais ils sont tous servis par le bloc de l'emplacement:

location ~* ^/proxy { 
     try_files $uri =404; 
     fastcgi_pass unix:/opt/local/var/run/php54/php-fpm-images.sock; 
     include  /documents/projects/intahwebz/intahwebz/conf/fastcgi.conf; 
    } 

Le bloc d'emplacement n'a pas besoin de connaître l'URL récrit parce qu'elles sont faites avant que le bloc de l'emplacement est rencontré.

Questions connexes