2010-11-30 31 views
0

J'utilise Kohana Framework 3.x. Mon serveur Web est Apache et j'utilise des hôtes virtuels, car je gère plus d'un site Web avec mon serveur.Apache: hôte virtuel et réécriture d'URL dans httpd.conf pour Kohana Framework

Mon httpd.conf ressemble à ceci:

<VirtualHost *:80> 
ServerName www.myPage1.com 
ServerAlias myPage1.com 
DocumentRoot /var/www/myPage1 
</VirtualHost> 
<VirtualHost *:80> 
ServerName www.myPage2.com 
ServerAlias myPage2.de 
DocumentRoot /var/www/myPage2 
</VirtualHost> 

Dans Kohana chaque requête http doit aller au premier index.php. Parce que je ne aime pas ces URL laid que tout commence par index.php (par exemple www.myPage1.com/index.php/item/detail/itemId) J'ai utilisé le fichier .htaccess suivant qui a parfaitement fonctionné

# Turn on URL rewriting 
RewriteEngine On 

# Installation directory 
RewriteBase/

# Protect hidden files from being viewed 
<Files .*> 
    Order Deny,Allow 
    Deny From All 
</Files> 

# Protect application and system files from being viewed 
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L] 

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# Rewrite all other URLs to index.php/URL 
RewriteRule .* index.php/$0 [PT] 

Je voudrais maintenant ne plus utiliser un fichier. Htaccess et à la place mettre toute la logique de réécriture dans mon fichier httpd.conf. Ce qui suit me donne un "400 Bad Request"

<VirtualHost *:80> 
RewriteEngine On 
<Files .*> 
    Order Deny,Allow 
    Deny From All 
</Files> 
RewriteRule ^(?:aplication|modules|system)\b.* index.php/$0 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php/$0 [PT] 

ServerName www.myPage2.com 
ServerAlias myPage2.com 
DocumentRoot /var/www/myPage2 
</VirtualHost> 

Qu'est-ce que je fais mal? L'aide serait appréciée!

Répondre

2

Vous n'avez pas de RewriteBase dans votre fichier httpd.conf. Et quel est le problème avec le .htaccess?

+0

Je pensais avoir juste besoin d'un RewriteBase lorsque j'utilise l'URL Rewriting par répertoire avec un fichier .htaccess. Si mon RewriteBase est comme "/", je ne peux pas commencer à démarrer Apache et obtenir une erreur. Je ne veux plus utiliser le fichier .htaccess parce que je veux que tous les paramètres soient centraux dans mon httpd.conf –

+1

Il y a beaucoup de choses qui ne vont pas avec '.htaccess', le principal étant un accès disque supplémentaire pour chaque répertoire sous le racine du document dans le chemin de requête, sur chaque requête. Votre serveur fonctionnera beaucoup plus rapidement si vous activez la numérisation de ces fichiers ('AllowOverride None'). –

1

pourrait-il être cette faute de frappe (il faudrait peut-être « application »):

RewriteRule ^(?:aplication|modules|system)\b.* index.php/$0 [L] 
1

Rappelez-vous, si vous mettez ces règles dans le principal fichier de configuration du serveur (généralement httpd.conf) plutôt que d'un .htaccess fichier, vous devez utiliser ^/... ... au lieu de^... ... au début de la ligne RewriteRule, en d'autres termes, ajouter une barre oblique.

vérifier cela, peut aider.

3

Si vous utilisez mod_rewrite dans un bloc VirtualHost à la condition REQUEST_FILENAME, vous ne obtenir le nom de fichier (ce qui est par the documentation). Au lieu de cela, cette variable contient la même valeur que REQUEST_URI, qui contient le chemin excluant la chaîne de requête.

Je cite la page ci-dessus liés:

Si elle est utilisée dans le contexte par serveur (par exemple, avant que la demande est mis en correspondance avec le système de fichiers) SCRIPT_FILENAME et REQUEST_FILENAME ne peut pas contenir le chemin complet du système de fichiers local depuis le chemin est inconnu à ce stade du traitement. Les deux variables contiendront initialement la valeur de REQUEST_URI dans ce cas. Pour obtenir le chemin d'accès complet au système de fichiers local de la requête dans un contexte par serveur, utilisez une fonction de recherche par URL% {LA-U: REQUEST_FILENAME} pour déterminer la valeur finale de REQUEST_FILENAME.

Cependant, j'ai trouvé que la solution %{LA-U:REQUEST_FILENAME}suggéré ne fonctionne pas, au moins pas pour les hôtes virtuels sur mon serveur. Pour être sûr que votre fonction RewriteCond lignes comme prévu dans un bloc VirtualHost, vous devez les préfixe DOCUMENT_ROOT, ainsi:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 

Cette méthode fonctionnera toujours. Le passage à _URI est dans le cas REQUEST_FILENAME un jour renvoie le nom de fichier réel, pour éviter un double préfixe de la racine du document.

+0

Life Saver! Je vous remercie! – benface

+0

@benface De rien :-) –