Nginx règle de réécriture pour CodeIgniter
Voici la règle en anglais:
Toute requête HTTP autres que celles pour index.php, les actifs dossier, le dossier des fichiers et robots.txt est traitée comme une demande de votre index.php fichier.
J'ai un .htaccess
fichier qui fonctionne correctement sur le serveur Apache:
RewriteCond $1 !^(index\.php|assets|files|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
Certains des résultats corrects pour cette règle:
example.com
= example.com/index.php
example.com/index.php/welcome
= example.com/welcome
example.com/assets/css/main.css
!= example.com/index.php/assets/css/main.css
J'ai essayé quelques outils pour convertir htaccess règle de nginx règle, mais tous ne l'étaient pas.
Via http://winginx.com/htaccess (manque les règles d'exception pour les actifs de dossier...):
location / { rewrite ^(.*)$ /index.php/$1 break; }
Via http://www.anilcetin.com/convert-apache-htaccess-to-nginx/ (erreur de 1 $de valeur):
if ($1 !~ "^(index.php|assets|files|robots.txt)"){
set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
rewrite ^/(.*)$ /index.php/$1 last;
}
Comment puis-je résoudre ce problème? Il est vraiment difficile de déboguer la règle.
Voici ma config nginx jusqu'à présent:
server {
listen 80;
server_name www.example.com example.com;
location / {
try_files $uri $uri//index.php?/$request_uri;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
OriginalL'auteur Letomkov | 2013-10-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ajouter ceci à votre config:
Cela fonctionnera correctement avec votre
location /
règle.Votre config aussi besoin d'ajouter de la racine du document et le fichier d'index par défaut.
Ajouter
error_log /var/log/nginx/localhost.error_log debug; rewrite_log on;
à votre configuration, redémarrez le serveur, puis essayez de charger un fichier dans le dossier assets. Dites-moi si vous voyez une erreur.Comment pourrais-je avoir une erreur:
open() "/etc/nginx/html/assets/..." failed (No such file or directory)
? La règle est manquant quelque chose qui aide nginx itinéraire pour corriger web directory?Vous avez été absent
root {$your_document_root};
Vous envisagez de remplacer
$request_uri
par$uri
, que celle-ci est normalisée (voir nginx.org/en/docs/http/ngx_http_core_module.html#variables). Pour que cela fonctionne, vous devrez également modifier la regex de filtrage.php
fichiers de traitement, comme le vôtre actuellement de ne pas manipuler le dernier cas de try_files fournies par Letomkov. Voir mezcalito.fr/hebergement/labo-single/2011/01/... pour plus de solution acceptableOriginalL'auteur anvoz
Que vous voulez faire à la place:
de $request_uri est à l'origine pour les URI de la requête par le client. Si vous souhaitez que l'URI de la requête APRÈS les autres Nginx règles de réécriture ont traité alors vous devez utiliser de $uri. Cependant, pour ce que vous essayez de faire de l'avant serait celui que vous voulez.
Aussi, vous devez vous échapper spécial de l'expression régulière des personnages comme
.
en utilisant une barre oblique inverse.example.com
- 404,example.com/index.php
- OK,example.com/assets/css/main.css
- 404. Est-il de toute façon puis-je déboguer la règle?mise à jour de votre question avec le contenu de votre fichier de configuration de Nginx.
J'ai ajouté mon nginx fichier de config à ma question. J'ai essayé de remplacer le
location / { ... }
règle avec votre question, mais il ne fonctionne pas.J'ai raté quelque chose dans ma config que j'ai trouvé. Votre règle est correcte, mais il faut travailler avec mon
location /
règle. Mais si vous demandez à un non-existait fichier dans le dossier des ressources, il sera toujours nécessaire de charger leindex.php
fichier.OriginalL'auteur cryptic ツ
S'il vous plaît essayer cette. Il fonctionne pour moi.
OriginalL'auteur cse031sust02