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':
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
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.
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
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.
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>