본문 바로가기
개발

Laravel public folder를 public_html로 변경

by 목장주 2019. 10. 17.
반응형

 

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