Quelqu'un peut il m'aider avec ça? J'ai l'impression de me cogner la tête contre un mur depuis plus de 2 heures maintenant.
J'ai Apache 2.2.8 + PHP 5.2.6
installé sur ma machine et le .htaccess
avec le code ci-dessous fonctionne bien, aucune erreur.
RewriteEngine on
RewriteCond $1 !^(index\.php|css|gfx|js|swf|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]
Le même code sur mon serveur de fournisseur d'hébergement me donne un code d'erreur 404 et génère only: No input file specified.
index.php est là. Je sais qu'ils ont installé Apache (ne peuvent trouver d'informations sur la version nulle part) et ils exécutent PHP v5.2.8.
Je suis dessus Windows XP 64-bit
, ils exécutent un Linux
avec PHP
dans CGI/FastCGI
mode. Quelqu'un peut-il suggérer quel pourrait être le problème?
PS. si c'est important, c'est que CodeIgniter
fonctionne avec des URL conviviales.
Update1:
mod_rewrite
est installé et activé.
Ce que j'ai remarqué, c'est que si je change de RewriteRule
en /index.php?$1
(point d'interrogation au lieu d'une barre oblique), il entre dans une boucle infinie. Quoi qu'il en soit, l'utilisation du point d'interrogation n'est pas une option car CodeIgniter
(obligatoire) ne fonctionnera pas de cette façon.
La page d'accueil fonctionne également lorsque je demande directement index.php: example.com/index.php
Je commence à penser que cela pourrait être Apache en pensant qu'une fois la barre oblique de fin ajoutée, ce n'est plus un fichier mais un dossier. comment changer un tel comportement?
Mise à jour 2:
J'avais tort.
Apache gère correctement ces URL.
Demande http://example.com/index.php/start/
(page d'accueil) ou toute autre adresse valide fonctionne.
Il semble que Apache
ne transfère simplement pas la requête pour une raison quelconque.
Mise à jour 3:
Juste pour être clair sur ce que j'essaie de réaliser.
Je veux réécrire des adresses comme ça:
http://www.example.com/something/ => http://www.example.com/index.php/something/http: //www.example.com/something/else/ => http://www.example.com/index.php/something/else/
Je me battais aussi la tête contre cela. J'installe également Code Igniter.
Le goocher n'était pas RewriteBase. Voici mon .htaccess:
DirectoryIndex index.php
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1 [L]
Le problème
J'ai rencontré un problème similaire tout à l'heure et malheureusement aucune des réponses dans ce fil n'a aidé:
Zend Framework donnait "Aucun fichier d'entrée spécifié.", Mais:
RewriteBase /
n'a pas aidéLa réponse est donc venue du site suivant: https://ellislab.com/forums/viewthread/55620/P15 [lien mort] (même si l'hôte n'est pas DreamHost).
La solution
Apparemment, tout ce que vous devez faire est de remplacer cette ligne:
RewriteRule ^(.*)$ index.php/$1
Avec ça:
RewriteRule ^(.*)$ index.php?/$1
Problème résolu.
Cela a fonctionné pour moi:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
Après index.php
, le point d'interrogation est important!
Go Daddy Users:
RESOLU !!!!
Essayez si cela fonctionne avec un RewriteCond
plus simple; comme celui qui réécrit uniquement tout ce qui n'est pas un fichier/dossier/lien existant:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /index.php/$1 [R,L]
mod_rewrite
est un peu trop intelligent pour son propre bien, car il essaie de savoir quel type de redirection il doit faire. Dans ce cas, il semble mod_rewrite
comme si vous essayez de rediriger vers un dossier, il recherche donc le dossier et ne le trouve pas, d'où l'erreur.
Edit: Juste pour être parfaitement clair, je pense que votre meilleur pari est de changer votre règle de réécriture en:
RewriteRule ^(.*)$ /index.php?$1 [L]
à moins qu'il n'y ait une raison très spécifique pour laquelle vous voulez que ce soit une barre oblique.
Edit 2: Je vois que vous avez déjà essayé cela. La raison pour laquelle vous obtenez une boucle infinie est parce que vous avez index.php dans votre condition de réécriture. Si vous supprimez cela, vous devriez être libre de la boucle infinie.
.htaccess pour Live Server: -
DirectoryIndex index.php
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1 [L]
.htaccess pour Localhost: -
RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1
Vous utilisez peut-être Nginx, pas un Apache. Le message d'erreur sera le même.
faire écho à vos données de serveur pour être sûr.
echo $_SERVER["SERVER_SOFTWARE"];
Il est très probable que l'administrateur de votre hôte ait désactivé la possibilité d'utiliser la réécriture dans .htaccess. Ils n'ont peut-être même pas installé mod_rewrite.
Envoyez-leur un e-mail et demandez
Comme il s'agit d'un problème de configuration du serveur, vous devriez peut-être demander à Server Fault
Modifier (puisque vous êtes sûr que le serveur est correctement configuré)
Avez-vous envisagé de marquer votre RewriteCond avec une fin de ligne $?
RewriteCond $1 !^(index\.php|css|gfx|js|swf|robots\.txt|favicon\.ico)
Will (basé sur mes connaissances limitées) bloquera toute URL contenant index.php, css, gfx ... au début d'une URL. Parce que vous n'avez pas de $ à la fin de l'expression rationnelle, il bloquera également toutes les URL qui continueront à partir de là ...
C'est à dire www.yourdomain.com/index.php/something
n'est pas redirigé, pareil avec www.yourdomain.com/js/something
Peut-être que vous voulez ajouter un $, ce qui nécessitera que l'URL se termine immédiatement après votre expression régulière.
RewriteCond $1 !^(index\.php|css|gfx|js|swf|robots\.txt|favicon\.ico)$
Étant donné que cette question semble attirer beaucoup d'attention, je voudrais proposer une autre réponse pour les personnes ayant rencontré le même problème et ne pouvant pas le résoudre à l'aide des réponses existantes. J'étais moi-même une de ces personnes jusqu'à il y a cinq minutes.
Toujours, je veux dire ( toujours vérifiez les journaux de votre serveur car ils pourraient vous présenter des informations utiles.
Après avoir vérifié les journaux de mon serveur (Apache2.4), j'ai découvert que open_basedir était à l'origine du problème:
mod_fcgid: stderr: PHP Avertissement: inconnu: restriction open_basedir en vigueur. Le fichier (/data/sites/domain/public/index.php) ne se trouve pas dans le ou les chemins autorisés: (/ usr/local/lib/php:/usr/local/bin:/data/sites/domain/http-docs) dans Inconnu sur la ligne 0
mod_fcgid: stderr: PHP Avertissement: inconnu: échec d'ouverture du flux: opération non autorisée dans Inconnu sur la ligne 0
Dans ce cas, open_basedir n'a pas pu gérer un lien symbolique que j'ai créé car il pointe vers l'extérieur des paramètres open_basedir. Élargissez le paramètre open_basedir au nouvel emplacement ou déplacez les fichiers requis vers l'intérieur de n'importe quel répertoire autorisé.
Voici une fois que j'ai attrapé no input file specified
droit à l'action:
Cela provoque:
RewriteRule ^(.*\.swf)$ redirect_php.php/?a=1 [last]
Cela l'a corrigé:
RewriteRule ^(.*\.swf)$ redirect_php.php?a=1 [last]
noter la /
avant la requête ?
Cela semble vraiment lié à AcceptPathInfo, qui concerne la possibilité de lire les chemins après les noms de fichiers:
http://domain.com/file.php/tricky_path/?regular_query_stuff