상세 컨텐츠

본문 제목

Laravel public folder를 public_html로 변경

개발

by 목장주 2019. 10. 17. 13:32

본문

 

Laravel 앱의 index.php는 /public 폴더 밑에 있다. 개발할 때 http://localhost:8080을 요청하면 /public/index.php가 가장 먼저 호출이 된다. 하지만, 아파치나 다른 웹서버 설정에 따라 /public이 아닌 /public_html 같은 다른 폴더를 public 폴더로 설정해야할 경우가 있다. 폴더 이름을 public_html으로 바꾸면 되지만, Laravel 앱은 /public에 모든 파일이 존재한다고 가정하므로 설정을 변경해 줘야 한다.

 

/public을 /public_html로 변경 후 앱을 실행해보자.

 

$ php artisan serve

 

그러면 다음과 같은 에러 메세지가 나온다.

 

at /Users/mdoo/Documents/workspace/demo-project/vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php:43
    39|      * @throws \Exception
    40|      */
    41|     public function handle()
    42|     {
  > 43|         chdir(public_path());
    44| 
    45|         $this->line("Laravel development server started: http://{$this->host()}:{$this->port()}");
    46| 
    47|         passthru($this->serverCommand(), $status);

  Exception trace:
  1   chdir("/Users/username/Documents/workspace/demo-project/public")
      /Users/username/Documents/workspace/demo-project/vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php:43

  2   Illuminate\Foundation\Console\ServeCommand::handle()
      /Users/username/Documents/workspace/demo-project/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32

  Please use the argument -v to see more details.

 ErrorException  : chdir(): No such file or directory (errno 2)

 

public_path() 함수를 사용해서 public 폴더 정보를 가져오는데 기본 경로인 /public 폴더를 반환한다. chdir 명령어로 /public 폴더를 이동하려했으나 폴더가 없으니 에러가 난 것이다. public_path는 path.public 값을 읽어서 경로명을 반환한다. 이 정보를  /app/Providers/AppServiceProvider.php에 설정해 주면 된다. 

 

/app/Providers/AppServiceProvider.php의 register() 함수에 다음 라인을 추가해준다. 

 

$this->app->bind('path.public', function() { 
	return base_path('public_html'); 
});

 

Laravel 패키지를 추가할 경우 package.json도 수정되는 경우가 있다. 예를 들어 laravel/ui 패키지를 추가하면 추가 후 npm install && npm run dev 명령을 추가로 실행하라는 메세지를 볼 수 있다. 이 때 npm run dev는 webpack을 이용해 public 폴더 밑에 app.js, app.scss 파일을 복사해 넣는 일을 한다. 따라서 /webpack.mix.js가 존대한다면 이 부분도 수정해 줘야 한다. 만약 없다면 아래 작업은 안해도 된다.

 

/webpack.mix.js을 열어보면 app.js, app.scss 파일을 public/js와 public/css에 복사하도록 설정이 되어있다. 이 부분을 다음과 같이 변경해 주면 된다. 

 

mix.js('resources/js/app.js', './js')
   .sass('resources/sass/app.scss', './css')
   .setPublicPath('public_html');

 

그리고 /server.php를 열어서 public으로 되어있는 디렉토리 이름을 public_html로 수정해 주면된다. 

 

if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) {
    return false;
}

require_once __DIR__.'/public_html/index.php';

 

 

 

관련글 목록

Laravel 6.x Authentication

 

Laravel 6.x Authentication

Laravel 6.x에 인증(Authentication) 기능을 추가하는 것은 Laravel 5.x에서 하던 방법과 크게 다르지 않다. Laravel이 6.x로 오면서 UI 부분이 좀 바뀌었는데 그 부분만 별도로 추가해 주면 손 쉽게 가능하다...

employee.tistory.com

 

 

 

'개발' 카테고리의 다른 글

zsh 터미널 환경 설정  (0) 2021.04.03
Laravel 6.x Passport 적용  (406) 2019.10.23
Laravel 6.x Authentication  (407) 2019.10.17
Plex에 Daum Movie Plugin 설치  (0) 2019.05.15
Install Docker on Ubuntu  (0) 2019.04.26

관련글 더보기