web-dev-qa-db-fra.com

Tous les fichiers css/img sont dirigés vers la page d'accueil du site

J'ai tiré une application Laravel depuis un serveur distant et j'essaie de configurer une version locale.

J'ai copié tous les fichiers et la base de données, et géré au serveur de l'application locale. Tous les itinéraires semblent fonctionner, à l'exception d'un gros problème: tous les éléments de l'itinéraire public vers la page d'accueil du site!

Par exemple, j'ai une image incluse comme suit:

<img src="{{ asset('img/main-logo.png') }}" />

Sur le serveur de production, cela affiche l'image, avec l'URL source https://www.example.com/img/main-logo.png et cela fonctionne correctement.

Sur mon serveur local, la source de l'image s'avère être http://localhost:8005/img/main-logo.png, ce qui devrait être correct, mais elle ne montre pas l'image. Lorsque j'essaie d'ouvrir cette URL dans le navigateur, au lieu d'afficher l'image, il ouvre la page d'accueil du site!

J'ai le fichier server.php dans le dossier racine, index.php dans public et le .htaccess suivant dans mon dossier public (copié du serveur de production):

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

    # Force compression for mangled headers.
    # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html

    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>

    <IfModule mod_headers.c>
     <filesMatch "\.(jpg|jpeg|png|gif|webp|js|ico)$">
        Header set Cache-Control "max-age=2628000, public"
     </filesMatch>
    </IfModule>

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    # Map certain file types to the specified encoding type in order to
    # make Apache serve them with the appropriate `Content-Encoding` HTTP
    # response header (this will NOT make Apache compress them!).

    # If the following file types wouldn't be served without the appropriate
    # `Content-Enable` HTTP response header, client applications (e.g.:
    # browsers) wouldn't know that they first need to uncompress the response,
    # and thus, wouldn't be able to understand the content.

    # http://httpd.Apache.org/docs/current/mod/mod_mime.html#addencoding

    <IfModule mod_mime.c>
        AddEncoding gzip              svgz
    </IfModule>

    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE "application/atom+xml" \
                                      "application/javascript" \
                                      "application/json" \
                                      "application/ld+json" \
                                      "application/manifest+json" \
                                      "application/rdf+xml" \
                                      "application/rss+xml" \
                                      "application/schema+json" \
                                      "application/vnd.geo+json" \
                                      "application/vnd.ms-fontobject" \
                                      "application/x-font-ttf" \
                                      "application/x-web-app-manifest+json" \
                                      "application/xhtml+xml" \
                                      "application/xml" \
                                      "font/opentype" \
                                      "image/svg+xml" \
                                      "image/x-icon" \
                                      "text/cache-manifest" \
                                      "text/css" \
                                      "text/html" \
                                      "text/javascript" \
                                      "text/plain" \
                                      "text/vtt" \
                                      "text/x-component" \
                                      "text/xml"
    </IfModule>

    RewriteEngine On

    RewriteRule ^robots\.txt$ robots.php

    # rewrite non www to www
    RewriteCond %{HTTP_Host} ^localhost:8005 [NC]
    RewriteRule ^(.*)$ http://localhost:8005/$1 [L,R=301,NC]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # redir for last / in url
    RewriteCond %{REQUEST_METHOD} =GET
    RewriteRule ^(.*)\/(\?.*)?$ /$1$2 [NC,L,R=301]

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

</IfModule>

Il s'agit donc du même .htaccess, des mêmes itinéraires, mais les actifs chargés sur le serveur de production ne sont pas chargés localement. Quelqu'un sait pourquoi cela peut être et comment y remédier?

J'ai essayé d'ajouter 'public /' aux URLs de l'actif, mais aussi des chemins absolus/relatifs, rien ne fonctionne.

EDIT: dans l’intervalle, j’ai essayé de modifier .htaccess de différentes manières, et même de le supprimer complètement, et rien n’a changé dans la façon dont le site Web gère l’acheminement des biens publics.

EDIT # 2: alors que http://localhost:8005/img/main-logo.png charge la page d'accueil du site, http://localhost:8005/public/img/main-logo.png génère une erreur 404

EDIT # 3: quand je charge http://localhost:8005/img/main-logo.png, cela s'affiche sous 'routage':

 enter image description here

6
jovan

j'ai eu le même problème et je l'ai corrigé. essayez ceci . J'ai changé /vendor/Illuminate/Foundation/helpers.php asset () comme suit:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

J'espère que ça va marcher

1
cijagani

Votre serveur utilise les modules personnalisés Apache tels que deflate, gzip, mais peut-être que ce n’est pas le cas sur votre ordinateur local.

Tout d’abord, pouvez-vous essayer d’utiliser les codes suivants dans votre fichier .htaccess avec le contenu par défaut de laravel.

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

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

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

Si les codes ci-dessus fonctionnent correctement, vous pouvez essayer d’installer ces modules personnalisés.

0
FGDeveloper

Ajoutez le code ci-dessous dans votre fichier d’hôte virtuel sous le dossier Apache C:\xampp\Apache\conf\extra\httpd-vhosts.conf.

<VirtualHost *:8005>
  ServerName my-app.local
  DocumentRoot "C:/XAMPP/htdocs/laravel/public"
  <Directory "C:/XAMPP/htdocs/laravel/public">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require local
  </Directory>
</VirtualHost>

REMARQUE: remplacez laravel par votre nom project folder.

Après cela, éditez votre fichier hôte à partir de C:\Windows\System32\drivers\etc\hosts et ajoutez la ligne ci-dessous.

127.0.0.1 my-app.local

et enfin redémarrez Apache et après redémarrage, essayez d'accéder à votre application avec http: //my-app.local

Remarque: N'OUBLIEZ PAS D'ENLEVER TOUTES LES MODIFICATIONS APPORTÉES AU FICHIER HTACCESS.

J'espère que ça va marcher

0
Karthik Sekar

Je ne sais vraiment pas pourquoi cela fonctionnerait sur le serveur et pas sur le local, à moins que certains paramètres/outillages sur le serveur ne soient pas les mêmes que sur votre local ... Peut-être est-ce devant un CDN? Cela empêcherait même les requêtes de frapper le serveur et d'obtenir les fichiers servis à partir du service ... Quoi qu'il en soit, voici comment je réglerais ce problème:

RewriteRule     ^img/(.*) path/to/public/$1 [L]
# Handle Front Controller...
# ...

Cette ligne ajoutée réécrira tout ce qui commence par img dans votre répertoire public afin que le fichier soit directement servi. Vous devez modifier la règle pour tenir compte de tous les autres actifs statiques, comme vous pourriez avoir besoin de le faire pour vos fichiers javascript et css?

Il est également possible de réécrire uniquement si le fichier cible existe, mais pour ma part, je préfère donner une erreur 404 plutôt que de renvoyer l'utilisateur à la page d'accueil.

EDIT: Notez que cette réponse utilise ma connaissance globale de htaccess. Je ne sais pas Laravel beaucoup et il pourrait gérer les actifs statiques à partir de son PHP ... Mais ma solution devrait fonctionner quel que soit le framework.

0
Salketer

Il suffit de remplacer le fichier .htaccess de votre répertoire personnel comme indiqué ci-dessous et d’essayer. Cela fonctionnera dans le serveur aussi bien que dans votre local. Assurez-vous de sauvegarder votre fichier htaccess original.

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

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]

</IfModule> 
0
Karthik Sekar