Des redirections php étranges avec nginx (fonctionne bien dans apache)

Enfin, je décide de requestr ici des heures d'essais, de searchs et de searchs.

Il y a quelques mois, j'ai migré mon site vers une version plus récente et tout fonctionne bien avec mon ancien hébergement en apache.

Récemment, je migre vers un VPS où je décide d'utiliser Nginx en tant que server et je travaille dans les détails.

Mon problème est que j'essaie de faire des redirections spécifiques à l'aide d'un script PHP.

Les redirections fonctionnent très bien dans apache (localement et remotelly) mais dans nginx non.

Le comportement étrange est que, par exemple, lorsque j'essaie d'utiliser l'URL fakesite.tk/Section/index.php apache redirect vers fakesite.tk/Section/ mais Nginx renvoie une erreur 404 et si j'essaie l'URL fakesite.tk/Section/ index.php / mystérieusement travail (notez le slash à la fin) et redirigez vers fakesite.tk/Section// (Notez la double barre oblique)

J'ai essayé d'append une barre oblique à la fin de toutes les URL, mais cette redirection ne fonctionne pas également dans Nginx.

Si cela count, mon VPS en cours d'exécution dans Ubuntu (iquals que mon hôte) et je fais des tests dans une machine Windows.

Il y a mon file de configuration du site Nginx:

server { server_name *.fakesite.tk; return 301 $scheme://www.fakesite.tk$request_uri; } #Redirect non www to www site version server { server_name fakesite.tk; return 301 $scheme://www.fakesite.tk$request_uri; } server { listn 80; listn [::]:80; root /var/www/SiteFolder; index index.php; server_name www.fakesite.tk; #Stabilishing error 404 and 403 error pages error_page 404 /?error=404; error_page 403 /?error=403; #Friendly URLs location / { location / { try_files $uri $uri/ =404; rewrite ^/([^/]*)/$ /?sect=$1 last; rewrite ^/([^/]*)/([^/]*)/$ /?sect=$1&lang=$2 last; rewrite ^/([^/]*)/([^/]*)/([^/]*)/$ /?sect=$1&lang=$2&cont=$3 last; rewrite ^/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /?sect=$1&lang=$2&cont=$3&subcont=$4 last; } #Adding expire header location ~* \.(?:ico|css|js|gif|jpe?g|png|eot|svg|ttf|woff)$ { expires 30d; add_header Pragma public; add_header Cache-Control "public"; } #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; # fastcgi_index index.php; include fastcgi_params; } #deny access to .htaccess files, if Apache's document root # concurs with nginx's one location ~ /\.ht { deny all; } } 

Et mon script de redirection php:

 <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> <? php <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> ini_set ('display_errors', true); // Si estamos en localisé avec les erreurs. <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ url = "http: // $ _ SERVEUR [SERVER_NAME] $ _SERVER [REQUEST_URI]"; <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ newurl = $ url; <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ newurl = str_replace ('_', '-', $ url); // Replacez tous les _ avec - <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ newurl = str_replace ('index.php', '', $ newurl); // Suppression d'un index.php <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ newurl = str_replace ('. php', '', $ newurl); // Suppression de tout .php <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ newurl = str_replace ('/ Intro', '', $ newurl); // Suppression de toutes les sections d'introduction <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ extens = preg_match ('/ \. (jpg | gif | png | jpeg | js | css | woff | html | eot | svg | ttf | xml | map | min | txt) /', $ newurl); <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> if ($ extens! == 1 && $ newurl [strlen ($ newurl) - 1]! == '/') // Essayer de mettre une barre oblique à la fin <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> $ newurl. = '/'; <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> si ($ url! == $ newurl) <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> en-tête ("HTTP / 1.1 301 déplacé en permanence"); <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> En-tête ("Emplacement: $ newurl"); <?php ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores. error_reporting(E_ALL); $url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"; $newurl = $url; $newurl = str_replace('_', '-', $url);//Reeplace all _ with - $newurl = str_replace('index.php', '', $newurl);//Removing a index.php $newurl = str_replace('.php', '', $newurl);//Removing all .php $newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections $extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl); if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end { $newurl.='/'; } if($url !== $newurl) { header("HTTP/1.1 301 Moved Permanently"); header("Location: $newurl"); } ?> 

Je suppose que ce sont peut-être des détails très petits que je ne vois même pas, alors j'apprécie votre aide. Merci beaucoup.

EDIT: J'ai vérifié que var $ newurl a effectivement changé et entre dans la condition if, mais l'en- header(....); les lignes ne sont pas exécutées, j'ai mis une exit(); command après et il est exécuté, cela signifie affectivement l'en- header(...); les lignes n'ont pas été exécutées.

EDIT 2: Lorsque je mets manuellement un trait de soulignement dans l'URL et le slash à la fin de celui-ci, cela redirection plutôt bon, mais si je ne pose pas de barre oblique à la fin, cela ne fonctionne pas même lorsque vous exécutez le bloc conditionnel.

Ok les gars. Je l'ai finalement résolu, tout comme je l'ai dit était un très petit détail (les petits détails sont toujours les plus difficiles).

Le problème était avec le fcgi pour PHP configuré dans le file hôte virtuel pour nginx.

Dans le file d'origine (ci-dessous), j'ai dit à fcgi qu'il essayait de find le file et s'il ne déclenchait pas une 404 error , c'était mon erreur car il déclenchait son erreur personnelle et ne permettait pas à mon site de gérer cela, donc le script de redirection n'est pas exécuté.

 #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } #Enabling PHP #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ \ .php $ #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } # Avec php5-fpm: #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } try_files $ uri = 404; #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } fastcgi_pass unix: /var/run/php5-fpm.sock; #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } fastcgi_index index.php; #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } inclure fastcgi_params; #Enabling PHP location ~ \.php$ { # With php5-fpm: try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } 

Résoudre le problème. J'ai simplement dit à la fcgi qui envoie l'erreur de code comme un paramètre pour permettre au site de la gérer, comme fcgi :

 #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } #Enabling PHP #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ \ .php $ #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } # Avec php5-fpm: #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } # Énoncez ici !! #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } try_files $ uri /? error = 404; #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } fastcgi_pass unix: /var/run/php5-fpm.sock; #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } fastcgi_index index.php; #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } inclure fastcgi_params; #Enabling PHP location ~ \.php$ { # With php5-fpm: #try_files $uri =404; #Mistake here!! try_files $uri /?error=404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } 

EDIT: je préfère append la barre oblique de fin à la fin de l'URL (pour éviter 404 erreurs) en utilisant le file de configuration d'hôte virtuel nginx approprié car PHP ne fonctionne pas correctement. J'ai seulement ajouté la ligne suivante dans le bloc du server : #Adding trailing slash at the end rewrite ^([^.]*[^/])$ $1/ permanent;

Notez qu'il ne redirige que lorsque l'URL n'a pas de point '.' .

J'espère que quelqu'un pourrait utiliser cette expérience pour résoudre un problème connexe, à l'avenir.

À plus tard.