Question Apache2: 400 requêtes incorrectes avec règles de réécriture, rien dans le journal des erreurs?


Ça me rend dingue.

Contexte: J'utilise Apache2 et PHP intégrés à Mac OS X 10.6.

J'ai une configuration vhost comme suit:

NameVirtualHost *:81

<Directory "/Users/neezer/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<VirtualHost *:81>
    ServerName lobster.dev
    ServerAlias *.lobster.dev
    DocumentRoot /Users/neezer/Sites/lobster/www

    RewriteEngine On
    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]

    LogLevel debug
    ErrorLog /private/var/log/apache2/lobster_error
</VirtualHost>

C'est dans /private/etc/apache2/users/neezer.conf.

Mon code dans le lobster project est PHP avec le Cadre CodeIgniter. Essayer de charger http://lobster.dev:81/ Donne moi:

400 mauvaise demande

Normalement, j'irais vérifier mes journaux pour voir la cause, mais mes journaux sont vides! J'ai regardé dans les deux /private/var/log/apache2/error_log et /private/var/log/apache2/lobster_erroret n’enregistre AUCUN message relatif au 400. J’ai LogLevel mis à debug dans /private/etc/apache2/http.conf.

La suppression des règles de réécriture supprime l'erreur, mais ces mêmes règles fonctionnent sur mon hôte MAMP. J'ai vérifié et rewrite_module est chargé dans mon installation Apache par défaut. ma http.conf peut être trouvé ici: https://gist.github.com/1057091

Ce qui donne? Faites-moi savoir si vous avez besoin d'informations supplémentaires.

Remarque: je ne veux pas ajouter les règles de réécriture à .htaccess dans le répertoire du projet (il est archivé dans un dépôt Git et je ne veux pas le toucher).


5
2018-06-30 21:54


origine


Vous avez regardé dans le journal de php? - Cucumber
Je n'arrive même pas à obtenir mon journal php. Vous pouvez voir mon php.ini déposer ici: gist.github.com/1057384 - neezer
Je pense que vous obtenez cette erreur, quand écrivez votredomaine.com? Que se passe-t-il lorsque vous essayez de faire référence à votredomaine.com/index.php? - Cucumber
Même chose lorsque vous essayez quelque chose sur le site, même /index.php. - neezer


Réponses:


Pour les règles mod_rewrite compliquées, il est conseillé de consigner la séquence d'événements pour voir ce qui se passe. Faire cela en utilisant RewriteLoget relancer le RewriteLogLevel pour voir les détails.

mod_rewrite est très flexible et on peut faire beaucoup de choses avec les règles de réécriture, et c'est aussi assez compliqué. Un étranger aura du mal à déboguer vos règles sans voir le contexte plus large. La meilleure chose à faire est de déboguer vous-même. Regardez les journaux dans une fenêtre pendant que vous expérimentez des modifications de configuration dans une deuxième fenêtre. Apportez une petite modification, enregistrez le fichier, rechargez Apache et appuyez à nouveau sur l'URL. Répéter.

Voici une bonne description de RewriteLog from the Apache Manuel:

Journal de réécriture

Lorsque vous utilisez le puissant   et fonctionnalités complexes de mod_rewrite,   il faut presque toujours utiliser   le RewriteLog pour aider au débogage.   Ce fichier journal produit une analyse détaillée   analyse de la façon dont le moteur de réécriture   transforme les demandes. Le niveau de   le détail est contrôlé par le   Directive RewriteLogLevel.


6
2018-06-30 22:28



Ok, il essayait de charger index.php//index.phpet c'était le problème. J'ai depuis changé la règle pour lire RewriteRule ^\/(.*)$ index.php/$1 [L,QSA] à cela fonctionne comme prévu. Merci. - neezer


Votre substitution dans <virtualhost> le contexte utilise une URL non absolue. Vous ne pouvez pas faire cela en dehors du contexte Directory / htaccess.


2
2017-07-03 15:22



Merci c'était mon problème: RewriteRule ~/(.+) something.php/$1 -> RewriteRule ~/(.+) /something.php/$1 corrigé - SeanDowney


Quelques autres notes, devenues un peu trop grandes pour être contenues dans un simple commentaire:

RewriteCond $1 fonctionne, mais c'est assez dangereux et fragile. En particulier, vous auriez facilement pu réécrire RewriteRule afin de désactiver complètement la fonctionnalité de ce RewriteCond et vous ne le sauriez jamais. L'utilisation de %{REQUEST_URI} est recommandé comme solution, à la RewriteCond %{REQUEST_URI} ^/(index\.php|resources|robots\.txt).

Prochain numéro: ces deux lignes:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

ne sont pas fonctionnels tels que présentés. Ils doivent soit être placés dans un <Directory> strophe, ou modifiée pour utiliser les macros d'anticipation (par exemple, RewriteCond %{LA-U:REQUEST_FILENAME} !-f).

La cause réelle de votre besoin de supprimer le / est-ce .htaccess enlève le leader /à partir du premier argument de RewriteRule, alors qu'il est livré avec / intact à RewriteRules dans httpd.conf (ou son Included), ce qui est important à retenir si vous essayez de déplacer cette règle dans un fichier .htaccess. Vous pouvez retravailler la règle pour qu'elle soit .htaccess / httpd.conf-agnostic en faisant quelque chose comme: RewriteRule ^/?(.*)$ index.php/$1 [L,QSA].

Une dernière remarque: comme vous pouvez le voir dans la règle ci-dessus, vous n'avez pas besoin d'échapper à la / avec une barre oblique inverse.


1
2017-07-01 01:46



+1 merci. Je venais de copier / coller ceci au plus fort de l’instant, mais je vais certainement revenir en arrière et revoir ces règles comme vous l’avez suggéré. - neezer