Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.
Давайте начнем с простой функции JavaScript:
function foo(){
// do something
return 'wohoo';
}
let bar = foo(); // bar is 'wohoo' here
Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.
Теперь добавим немного завихрения, введя небольшую задержку в нашей функции, чтобы все строки кода не выполнялись последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:
function foo(){
setTimeout( ()=>{
return 'wohoo';
}, 1000 )
}
let bar = foo() // bar is undefined here
Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo()
после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined
), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.
Итак, как мы решаем эту проблему?
Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:
function foo(){
return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
setTimeout ( function(){
// promise is RESOLVED , when exececution reaches this line of code
resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
}, 1000 )
})
}
let bar ;
foo().then( res => {
bar = res;
console.log(bar) // will print 'wohoo'
});
Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve
значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.
server.php
в корневую папку Laravel на index.php
.htaccess
из каталога /public
в свой Корневая папка Laravel. Thats it !! :)
Просто создайте файл .htaccess у root и добавьте в него эти строки
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Вот и все!
Вышеприведенный код работает с корневой папкой public_html. Сказав, что ваш основной файл laravel должен находиться внутри папки public_html, если ваш каталог выглядит как public_html / laravelapp / public, и если вы поместите вышеуказанный код в laravelapp, это не сработает. Поэтому вы должны скопировать все ваши основные файлы в public_html и поместить там файл .htaccess.
Если вы хотите сохранить код в подкаталоге, вы можете создать субдомен, тогда этот код также будет работать для этого.
Предположим, вы поместили все остальные файлы и каталоги в папку с именем «locale».
[/g0]
Просто перейдите в index.php и найдите эти две строки:
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
и изменить их на это:
require __DIR__.'/locale/bootstrap/autoload.php';
$app = require_once __DIR__.'/locale/bootstrap/app.php';
После того, как я установил Laravel в первый раз, я столкнулся с известной проблемой «общих папок», и я придумал это решение, которое, по моему мнению, является «более чистым»,
public
в URI .env
файл против любопытных людей Все можно сделать, просто отредактировав .htaccess
с помощью mod_rewrite
и четырех простых правил.
.htaccess
в public/.htaccess
в основной корень Я прокомментировал все, так что это должно быть ясно (я надеюсь) также тем, кто никогда не использовал mod_rewrite
(не то, что я эксперт, все наоборот). Кроме того, чтобы понять правила, должно быть ясно, что в Laravel, если Билл подключается к https://example.com
, загружается https://example.com/index.php
. Этот файл содержит только команду header("refresh: 5; https://example.com/public/")
, которая отправляет запрос на https://example.com/public/index.php
. Этот второй index.php
отвечает за загрузку контроллера и других вещей.
# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# RULES ORIGINALLY IN public/.htaccess ---
# 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]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# --- END
# PERSONAL RULES ---
# All the requests on port 80 are redirected on HTTPS
RewriteCond %{SERVER_PORT} ^80$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
# When .env file is requested, server redirects to 404
RewriteRule ^\.env$ - [R=404,L,NC]
# If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
# N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
# .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*) /public/index.php [L]
# If the current request is asking for a REQUEST_FILENAME that:
# a) !== existent directory
# b) !== existent file
# => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]
# If the current request is asking for a REQUEST_FILENAME that:
# a) !== existent directory
# b) !== existent file
# => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
# If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
# e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
# Client asks for example.com/media/bamboo.jpg
# Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
# With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
# --- END
</IfModule>
Следующее правило (изначально в public/.htaccess
) может быть удалено. Это же правило, по сути, более подробно объясняется в двух последних правилах.
# Handle Front Controller...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
EDIT: я пропустил решение Абхинава Сарасвата и его ответ должен быть принят. Просто одно, простое и понятное правило, которое перенаправляет весь трафик в общую папку без изменения какого-либо файла.
Другим методом, который я использую, является создание символической ссылки (в Linux, не знаю о Win) с помощью команды ln в htdocs или www i.e. ln projectname/public project
Таким образом, сайт доступен через localhost / project
Сначала вы можете использовать эти шаги
Для Laravel 5:
1. Переименуйте server.php в корневую папку Laravel в index.php
2.. Скопируйте файл .htaccess из / общедоступной папки в корневую папку Laravel.
blockquote>source: https://stackoverflow.com/a/28735930
после выполнения следующих действий то вам нужно изменить весь путь css и script, но это будет утомительным.
Решение: просто вы можете внести незначительные изменения в функцию
helpers::asset
.Для этого:
- открыть
vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
- перейти к строке 130
- записать
"public/".$path
вместо$path
,function asset($path, $secure = null){ return app('url')->asset("public/".$path, $secure); }
1) Я не нашел рабочий метод для перемещения общего каталога в L5. Хотя вы можете изменить некоторые вещи в bootstrap index.php, кажется, что несколько вспомогательных функций основаны на предположении, что этот общедоступный каталог существует. Честно говоря, вы действительно не должны перемещать общедоступный каталог.
2) Если вы используете MAMP, тогда вы должны создавать новые vhosts для каждого проекта, каждый из которых служит для создания общего каталога. После создания вы получаете доступ к каждому проекту по определенному имени сервера. http://project1.dev , http://project2.dev
Я решил проблему, используя 2 ответа:
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]
. Если есть другие статические файлы, просто добавьте расширение в предыдущий объявленный список @ rimon.ekjon сказал:
Переименуйте server.php в корневую папку Laravel на index.php и скопируйте файл .htaccess из / общедоступного каталога в корневую папку Laravel. -- Это оно !! :)
blockquote>Это работает для меня. Но все файлы ресурсов в / общедоступном каталоге не смогли найти и запросить URL-адреса, потому что я использовал вспомогательный помощник.
Я изменил /Illuminate/Foundation/helpers.php/asset () функцию следующим образом:
function asset($path, $secure = null) { return app('url')->asset("public/".$path, $secure); }
Теперь все работает:)
Спасибо @ rimon.ekjon и всем вам.
Даже если эти решения будут работать для вас, ребята, я прошу вас не следовать этому. Вот почему.
Вы должны указывать свой корень хоста Apache в директорию $LARAVEL_PATH/public
вместо $LARAVEL_PATH
.
Точка наличия подкаталога для корня www host вместо корня проекта заключается в том, что вы не пропускаете какие-либо файлы своего проекта через ваш веб-сервер.
Хотя все PHP файлы имеют суффикс файла .php
, злонамеренный пользователь может получить доступ к вашему каталогу $LARAVEL_PATH/storage
и содержимому его подкаталога, прочитайте ваши composer.json
или package.json
, чтобы найти уязвимые зависимости или прочитать файл .env
и т. д.
Если вы используете общий хостинг, и у вас есть обязательный public_html
, попробуйте установить Laravel за пределами этого каталога public_html
и либо удалить public_html (если пусто), либо заменить его символической ссылкой на $LARAVEL_PATH/public
ИЛИ, если вы хотите, чтобы Laravel instance, чтобы быть подкаталогом public_html
, сделать то же самое, но создать символическую ссылку от $LARAVEL_PATH/public
до public_html/$PROJECT_SUBDIR
.
Этот общедоступный каталог существует по причине, чтобы сделать проект более безопасным. Решите актуальную проблему и не пытайтесь разбить это простое, но приятное дополнение безопасности. :)
Надеюсь, это поможет.
Легкий способ удалить публикацию из larvel 5 url. Вам просто нужно обрезать index.php и .htaccess из общего каталога и вставить его в корневой каталог, вот и все и заменить две строки в index.php как
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
Для пользователя XAMPP для удаления публики из URL-адреса без касания laravel по умолчанию файловая система должна установить для вашего приложения виртуальный хост для вашего приложения. jsut выполните следующие действия.
C:/xampp/apache/conf/extra
или везде, где находятся ваши файлы XAMPP. NameVirtualHost *:80
и раскомментируйте или удалите хэш. <VirtualHost *>
ServerAdmin admin@localhost.com
DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
ServerName localhost
ServerAlias localhost
<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost eateryengine.dev>
ServerAdmin admin@localhost.com
DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
ServerName eateryengine.dev
ServerAlias eateryengine.dev
<Directory "C:/xampp/htdocs/eateryengine">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
C:/Windows/System32/drivers/etc/hosts
, где хосты - это файл. Откройте его с помощью блокнота. 127.0.0.1 localhost
127.0.0.1 localhost
127.0.0.1 eateryengine.dev #change to match your Virtual Host.
127.0.0.1 demo.eateryengine.dev #manually add new sub-domains.
Исходную статью можно найти здесь здесь
Даже если я не рекомендую помещать Laravel в корневую папку, есть некоторые случаи, когда этого избежать нельзя; для этих случаев вышеуказанные методы не работают для активов, поэтому я сделал быстрое исправление, изменяя htaccess: после копирования server.php на index.php отредактируйте файл .htaccess следующим образом:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
### fix file rewrites on root path ###
#select file url
RewriteCond %{REQUEST_URI} ^(.*)$
#if file exists in /public/<filename>
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
#redirect to /public/<filename>
RewriteRule ^(.*)$ public/$1 [L]
###############
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
#RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
#RewriteCond %{REQUEST_FILENAME} -f #
RewriteRule ^ index.php [L]
</IfModule>
Это было быстрое решение, которое я должен был сделать, чтобы кто-нибудь мог его обновить.
В Laravel 5.5 создайте файл .htaccess в корневом каталоге и поместите следующий код: - Ссылка Ссылка
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>
шаг 1: файл server.php в корневой директории переименовывается как index.php
Шаг 2:
копирует файл .htaccess из общего каталога в root direct
Всегда существует причина иметь общую папку в настройке Laravel, все общедоступные материалы должны присутствовать в общей папке,
Не указывайте свой IP-адрес / домен на корневую папку Laravel, но укажите ее в общую папку. Это небезопасно, указывая сервер Ip на корневую папку., Потому что, если вы не введете ограничения в
blockquote>.htaccess
, вы можете легко получить доступ к другим файлам.,Просто напишите условие перезаписи в
.htaccess
и установите модуль перезаписи и включите модуль перезаписи, проблема, которая добавит публики в маршрут, будет решена.
Можно удалить публикацию из url в laravel5. Выполните следующие шаги:
шаг 1 скопируйте весь файл из общедоступного и вставьте в корневой каталог
шаг 2 откройте файл index.php, замените на
require __DIR__.'/../bootstrap/autoload.php';
на
require __DIR__.'/bootstrap/autoload.php';
и
$app = require_once __DIR__.'/../bootstrap/app.php';
to
$app = require_once __DIR__.'/bootstrap/app.php';
И удалите весь кеш и файлы cookie.
Я хотел бы добавить к @Humble Learner и отметить, что правильное местоположение для «исправления» URL-адреса для ресурсов - это /Illuminate/Routing/UrlGenerator.php/asset().
Обновить метод для сопоставления:
public function asset($path, $secure = null)
{
if ($this->isValidUrl($path)) return $path;
$root = $this->getRootUrl($this->getScheme($secure));
return $this->removeIndex($root).'/public/'.trim($path, '/');
}
Это позволит исправить скрипты, стили и пути к изображениям. Все для путей к ресурсам.
Вот лучшее и кратчайшее решение, которое работает для меня, начиная с мая 2018 года для Laravel 5.5
. 1- просто вырезать ваш .htaccess
файл из / общедоступного каталога в корневой каталог и заменить его содержимое с помощью следующего кода:
<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 ^ server.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
</IfModule>
2- Просто сохраните файл .htaccess
, и это все. наслаждайтесь!
Я просто переименую server.php
в index.php
, и он работает
Это хорошо работает для всех версий laravel ...
Вот моя структура каталогов,
/laravel/
... app
... bootstrap
... public
... etc
Следуйте этим простым шагам
требует DIR. '/ .. / bootstrap / autoload.php';
blockquote>to
требует DIR. '/ bootstrap / autoload.php';
blockquote>и
$ app = require_once DIR. '/ .. / bootstrap / start.php';
blockquote>to
$ app = require_once DIR. '/ bootstrap / start.php';
blockquote>
- теперь открываем bootstrap / paths.php и изменяем путь к общедоступной директории:
'public' => DIR. '/ .. / public',
blockquote >to
'public' => DIR. '/ ..',
blockquote>и вот оно, теперь попробуйте http: // localhost / Laravel /
You can follow only 2 step
1- cut .htaccess from public folder and paste to root(mainFolder)
2- Rename server.php file to index.php AT your root dir. (mainFolder)
Я прочитал статью раньше, и она работает нормально, но на самом деле не знаю, что это безопасно или нет.
a. Create new folder local.
b. Move all project into the local folder expect public folder.
c. Move all the content of public folder to project root.
d. Delete the blank public folder
f. Edit the index file.
Измените index.php
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
на
require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';