Laravel 5.5. .htaccess file [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» 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 значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

159
задан user1537360 6 February 2015 в 12:13
поделиться

22 ответа

Для Laravel 5:

  1. Переименуйте server.php в корневую папку Laravel на index.php
  2. Скопируйте файл .htaccess из каталога /public в свой Корневая папка Laravel.

Thats it !! :)

313
ответ дан brezanac 23 August 2018 в 16:48
поделиться

Просто создайте файл .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.

Если вы хотите сохранить код в подкаталоге, вы можете создать субдомен, тогда этот код также будет работать для этого.

12
ответ дан Abhinav Saraswat 23 August 2018 в 16:48
поделиться

Предположим, вы поместили все остальные файлы и каталоги в папку с именем «locale».

enter image description here [/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';
10
ответ дан Angelo Joseph Salvador 23 August 2018 в 16:48
поделиться

Laravel 5.5

После того, как я установил Laravel в первый раз, я столкнулся с известной проблемой «общих папок», и я придумал это решение, которое, по моему мнению, является «более чистым»,


Достижения

  • Не имеют слова public в URI
  • Защитите .env файл против любопытных людей

Все можно сделать, просто отредактировав .htaccess с помощью mod_rewrite и четырех простых правил.


Шаги

  1. Переместите файл .htaccess в public/.htaccess в основной корень
  2. Отредактируйте его, как показано ниже

Я прокомментировал все, так что это должно быть ясно (я надеюсь) также тем, кто никогда не использовал 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: я пропустил решение Абхинава Сарасвата и его ответ должен быть принят. Просто одно, простое и понятное правило, которое перенаправляет весь трафик в общую папку без изменения какого-либо файла.

0
ответ дан Brigo 23 August 2018 в 16:48
поделиться

Другим методом, который я использую, является создание символической ссылки (в Linux, не знаю о Win) с помощью команды ln в htdocs или www i.e. ln projectname/public project Таким образом, сайт доступен через localhost / project

0
ответ дан Eli Makumba 23 August 2018 в 16:48
поделиться

Сначала вы можете использовать эти шаги

Для Laravel 5:

1. Переименуйте server.php в корневую папку Laravel в index.php

2.. Скопируйте файл .htaccess из / общедоступной папки в корневую папку Laravel.

source: https://stackoverflow.com/a/28735930

после выполнения следующих действий то вам нужно изменить весь путь css и script, но это будет утомительным.

Решение: просто вы можете внести незначительные изменения в функцию helpers::asset.

Для этого:

  1. открыть vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
  2. перейти к строке 130
  3. записать "public/".$path вместо $path,
    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
    
0
ответ дан Ferhat KOÇER 23 August 2018 в 16:48
поделиться

1) Я не нашел рабочий метод для перемещения общего каталога в L5. Хотя вы можете изменить некоторые вещи в bootstrap index.php, кажется, что несколько вспомогательных функций основаны на предположении, что этот общедоступный каталог существует. Честно говоря, вы действительно не должны перемещать общедоступный каталог.

2) Если вы используете MAMP, тогда вы должны создавать новые vhosts для каждого проекта, каждый из которых служит для создания общего каталога. После создания вы получаете доступ к каждому проекту по определенному имени сервера. http://project1.dev , http://project2.dev

21
ответ дан Jeremy Schaffer 23 August 2018 в 16:48
поделиться

Я решил проблему, используя 2 ответа:

  1. Переименование server.php на index.php (без изменений)
  2. Скопируйте .htaccess из общей папки в Корневая папка (например, rimon.ekjon, указанная ниже)
  3. Изменение .htaccess для статистики: бит
    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]
    
    . Если есть другие статические файлы, просто добавьте расширение в предыдущий объявленный список
93
ответ дан Mian Haseeb 23 August 2018 в 16:48
поделиться

@ rimon.ekjon сказал:

Переименуйте server.php в корневую папку Laravel на index.php и скопируйте файл .htaccess из / общедоступного каталога в корневую папку Laravel. -- Это оно !! :)

Это работает для меня. Но все файлы ресурсов в / общедоступном каталоге не смогли найти и запросить URL-адреса, потому что я использовал вспомогательный помощник.

Я изменил /Illuminate/Foundation/helpers.php/asset () функцию следующим образом:

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

Теперь все работает:)

Спасибо @ rimon.ekjon и всем вам.

32
ответ дан Miron 23 August 2018 в 16:48
поделиться

Даже если эти решения будут работать для вас, ребята, я прошу вас не следовать этому. Вот почему.

Вы должны указывать свой корень хоста 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.

Этот общедоступный каталог существует по причине, чтобы сделать проект более безопасным. Решите актуальную проблему и не пытайтесь разбить это простое, но приятное дополнение безопасности. :)

Надеюсь, это поможет.

4
ответ дан Mittul At TechnoBrave 23 August 2018 в 16:48
поделиться

Легкий способ удалить публикацию из larvel 5 url. Вам просто нужно обрезать index.php и .htaccess из общего каталога и вставить его в корневой каталог, вот и все и заменить две строки в index.php как

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
39
ответ дан Muhammad Sadiq 23 August 2018 в 16:48
поделиться

Для пользователя XAMPP для удаления публики из URL-адреса без касания laravel по умолчанию файловая система должна установить для вашего приложения виртуальный хост для вашего приложения. jsut выполните следующие действия.

  1. Откройте приложение панели управления XAMPP и остановите Apache. Помните, что поздние компьютеры Windows могут запускать его как службу, поэтому установите флажок слева от модуля Apache.
  2. Перейдите к C:/xampp/apache/conf/extra или везде, где находятся ваши файлы XAMPP.
  3. Откройте файл с именем httpd-vhosts.conf с помощью текстового редактора.
  4. Вокруг строки 19 найдите # NameVirtualHost *:80 и раскомментируйте или удалите хэш.
  5. В самом низу файл вставьте следующий код:
<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>
  1. Теперь вы можете скопировать и вставить код выше, чтобы добавить каталоги виртуального хоста. Например, я работаю над сайтом под названием Eatery Engine, поэтому следующий фрагмент позволит мне работать с поддоменами на моей локальной установке:
<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>
  1. Следующий заголовок в файл хоста Windows, чтобы изменить ваши HOSTS. файл будет расположен в C:/Windows/System32/drivers/etc/hosts, где хосты - это файл. Откройте его с помощью блокнота.
  2. Ищите разрешение имени #localhost обрабатывается в самом DNS.

127.0.0.1 localhost

обрабатывается разрешение имени локального хоста в самом DNS.

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.
  1. Перезапустите Apache и проверьте все.

Исходную статью можно найти здесь здесь

3
ответ дан pirho 23 August 2018 в 16:48
поделиться

Даже если я не рекомендую помещать 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>

Это было быстрое решение, которое я должен был сделать, чтобы кто-нибудь мог его обновить.

0
ответ дан Plokko 23 August 2018 в 16:48
поделиться

В 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>
27
ответ дан Raham 23 August 2018 в 16:48
поделиться

шаг 1: файл server.php в корневой директории переименовывается как index.php

Шаг 2:

копирует файл .htaccess из общего каталога в root direct

0
ответ дан Ravindra Bhanderi 23 August 2018 в 16:48
поделиться

Всегда существует причина иметь общую папку в настройке Laravel, все общедоступные материалы должны присутствовать в общей папке,

Не указывайте свой IP-адрес / домен на корневую папку Laravel, но укажите ее в общую папку. Это небезопасно, указывая сервер Ip на корневую папку., Потому что, если вы не введете ограничения в .htaccess, вы можете легко получить доступ к другим файлам.,

Просто напишите условие перезаписи в .htaccess и установите модуль перезаписи и включите модуль перезаписи, проблема, которая добавит публики в маршрут, будет решена.

3
ответ дан Reiah Paul Sam 23 August 2018 в 16:48
поделиться

Можно удалить публикацию из 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.

10
ответ дан Rizky Syaiful 23 August 2018 в 16:48
поделиться

Я хотел бы добавить к @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, '/');
}

Это позволит исправить скрипты, стили и пути к изображениям. Все для путей к ресурсам.

6
ответ дан Sean Perkins 23 August 2018 в 16:48
поделиться

Вот лучшее и кратчайшее решение, которое работает для меня, начиная с мая 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, и это все. наслаждайтесь!

0
ответ дан tony pro 23 August 2018 в 16:48
поделиться

МЕТОД 1:

Я просто переименую server.php в index.php, и он работает

МЕТОД 2:

Это хорошо работает для всех версий laravel ...

Вот моя структура каталогов,

/laravel/
... app
... bootstrap
... public
... etc

Следуйте этим простым шагам

  1. переместите все файлы из общедоступного каталога в root / laravel /
  2. теперь нет необходимости в общедоступном каталоге, поэтому, возможно, вы можете удалить его сейчас
  3. теперь откройте index.php и выполните следующие замены

требует DIR. '/ .. / bootstrap / autoload.php';

to

требует DIR. '/ bootstrap / autoload.php';

и

$ app = require_once DIR. '/ .. / bootstrap / start.php';

to

$ app = require_once DIR. '/ bootstrap / start.php';

  1. теперь открываем bootstrap / paths.php и изменяем путь к общедоступной директории:

'public' => DIR. '/ .. / public',

to

'public' => DIR. '/ ..',

и вот оно, теперь попробуйте http: // localhost / Laravel /

5
ответ дан Wasim A. 23 August 2018 в 16:48
поделиться
 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) 
0
ответ дан Yagnesh bhalala 23 August 2018 в 16:48
поделиться

Я прочитал статью раньше, и она работает нормально, но на самом деле не знаю, что это безопасно или нет.

    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';
0
ответ дан Yousef Altaf 23 August 2018 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: