web-dev-qa-db-fra.com

Laravel 5 nécessite index.php en utilisant l'hôte virtuel Apache

Lorsque je charge des pages qui ne sont pas root, la page ne se charge pas sans index.php avant l'itinéraire. L'erreur que j'obtiens:

 Not Found

 The requested URL /login was not found on this server.

 Apache/2.4.7 (Ubuntu) Server at mydomain.com Port 80

Pour commencer, j'ai un fichier hôte virtuel contenant:

//also tried adding DirectoryIndex here before <directory>
<directory /var/www/mydomain.com>
    DirectoryIndex index.php
    AllowOverride ALL
</directory>

et un .htacces dans mon public avec:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

J'ai un autre domaine avec la même configuration .htaccess et appache sur le même serveur et cela fonctionne très bien. J'ai également redémarré Apache. Si j'utilise phpinfo sur ma page index.php/route que je vois sur les modules chargés:

mod_rewrite mod_setenvif 

Lorsque vous exécutez le site Web localement avec xampp, tout fonctionne correctement. Pendant des heures, j'essaye maintenant mais je ne peux pas le réparer ou trouver une erreur (les journaux sont vides) ou des solutions que je n'ai pas encore essayées.

Modifier:

J'utilise Ubuntu Ubuntu 14.04 x64 sur un VPS Digital Ocean. Et j'ai essayé de le rallumer et de l'éteindre (comme suggéré). PHP Version 5.5.9-1ubuntu4.9. J'ai suivi this tutoriel pour tout configurer (sauf la partie direcoty). J'ai changé l'emplacement du journal Apache et un Le fichier error.log est créé sur le répertoire donné mais aucune erreur ne s'y trouve.

Ma configuration actuellement appache est:this (J'ai vérifié trois fois les parties blanches où se trouve le nom de domaine).

Lorsque j'exécute Apache2ctl -t D DUMP_VHOSTS, j'obtiens

enter image description here

cela me semble bien, j'ai également essayé de désactiver la configuration par défaut, mais cela n'a pas aidé.

Note: j'ai remplacé mon vrai domaine par mydomain.com en réalité j'utilise mon vrai domaine sur ces spots.

Réflexion comment puis-je savoir avec certitude que le fichier de conf im édition est celui utilisé par le domaine?

24

J'ai fini par supprimer le fichier conf complet et l'ai à nouveau copié de celui qui fonctionne. J'ai pris le .htaccess par défaut de laravel et cela a fonctionné. Malheureusement, je ne sais toujours pas ce qui n'allait pas. Le fichier conf actuel ressemble à

<Directory /var/www/mydomain.com>
    AllowOverride ALL
    DirectoryIndex index.php
</Directory>

Mon .htaccess dans/public

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
6

C'est le correct Règle alternative htaccess pour Laravel 5 a suggéré d'utiliser lorsque la valeur par défaut ne fonctionne pas:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Le Options +FollowSymLinks Je crois que joue un rôle important parce que le DirectotyIndex agit comme un lien symbolique.

Vérifiez également /app/config/app.php pour vous assurer que vous n'avez pas défini la configuration ('app.url') pour contenir l'index.php.

Si vous avez laravel installé dans un sous-répertoire voyez ceci: Comment puis-je supprimer "public/index.php" dans le laravel généré par l'url?

12
Neo

Avez-vous essayé de tout éteindre (arrêt), puis de le rallumer?

Si tout est comme vous le dites, cela devrait fonctionner. J'essaierais un redémarrage pour voir si cela change quelque chose.

Si ce n'est pas le cas, veuillez mettre à jour avec le système d'exploitation que vous utilisez.

8
CenterOrbit

J'ai eu presque exactement le même problème aujourd'hui, sur lequel @dasper m'a également aidé. J'utilise également Digital Ocean Ubuntu 14.04 et j'ai dû exécuter la commande a2enmod rewrite puis rechargez Apache2. Il semblait que même si la réécriture apparaissait pour être activée, ce n'était pas le cas.

4
Ben Harvey

Le problème pourrait être avec votre configuration de l'hôte virtuel et/ou un fichier . Htaccess mal placé.

Assurez-vous que votre fichier . Htaccess se trouve dans le dossier public / et que DocumentRoot est défini sur ce dossier public /.

Et aussi, la directive <Répertoire> ne contrôle pas votre hôte virtuel mais contrôle plutôt le dossier lui-même et comment il peut être (ou ne pas être) accessible sur le serveur. Pour modifier la configuration de l'hôte virtuel, faites-le dans la directive <VirtualHost>.

Voici un exemple de configuration d'hôte virtuel:

<VirtualHost *:80>
    ServerName mydomain.com
    ServerAlias www.mydomain.com
    DocumentRoot "/var/www/mydomain.com/public"
    DirectoryIndex index.php
</VirtualHost>

Voici la configuration par défaut Laravel Apache:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

et voici une alternative:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
3
user2479930

Tout d'abord, assurez-vous que mode_rewrite est activé. Je suis sûr que vous l'avez probablement fait, mais je veux m'assurer que rien ne manque.

Ensuite, voyez quelle version d'Apache vous exécutez puisque la syntaxe a changé entre 2.2 et 2.4. Cela ne devrait pas être un gros problème et doute fortement que ce soit le coupable mais pourrait vous éviter des ennuis à l'avenir

Ensuite, essayez de mettre la condition de réécriture à l'intérieur des informations vhost au lieu du fichier htaccess. Cela peut aider un peu avec les performances et vous donner un avertissement/erreur de console lors du redémarrage d'Apache où les erreurs htaccess pourraient être éliminées.

<directory /var/www/mydomain.com>
    Options -MultiViews
    AllowOverride ALL
    RewriteEngine On

    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</directory>

Au-delà de ce point, je serais perdu sans plus de journalisation ou d'informations du serveur. Vous pouvez également ajouter CustomLog dans le vhost et signaler toutes les demandes traitées par le serveur.

3
dasper

Une dernière remarque: n'oubliez pas de modifier /etc/hosts et ajouter 127.0.0.2 yourdomain.com

2
vivoconunxino

Essayez de renommer le server.php dans votre dossier racine Laravel vers index.php et copiez le fichier .htaccess du répertoire/public dans votre dossier racine Laravel .

Solution trouvée ici

2
Alex Kyriakidis

Je crois que votre chemin d'accès au répertoire est incorrect. Vous avez besoin /public à la fin parce que Laravel traite ce répertoire comme la racine Web. Essayez ceci:

<directory /var/www/mydomain.com/public>
    DirectoryIndex index.php
    AllowOverride ALL
</directory>

Mais la meilleure solution est de mettre le contenu du .htaccess fichier dans votre hôte virtuel. Comme ça:

<VirtualHost *:80>
    DocumentRoot "/var/www/mydomain.com/public"
    ServerName mydomain.com
    ServerAlias *.mydomain.com

    <Directory "/var/www/mydomain.com/public">
        # Ignore the .htaccess file in this directory
        AllowOverride None

        # Make pretty URLs
        <IfModule mod_rewrite.c>
            <IfModule mod_negotiation.c>
                Options -MultiViews
            </IfModule>

            RewriteEngine On

            # Redirect Trailing Slashes...
            RewriteRule ^(.*)/$ /$1 [L,R=301]

            # Handle Front Controller...
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^ index.php [L]
        </IfModule>
    </Directory>
</VirtualHost>

En outre, vous devez vous assurer que votre fichier de configuration est chargé en exécutant:

Apache2ctl -t -D DUMP_VHOSTS

Cela affichera une liste de tous les vhosts chargés. Si le vôtre ne figure pas dans cette liste, assurez-vous qu'il est activé en exécutant:

a2ensite [name_of_your_config_file]

Redémarrez ensuite Apache avec:

service Apache2 reload

2
BrokenBinary