[php] Laravel 5 – URL에서 공개 제거

나는 이것이 매우 인기있는 질문이라는 것을 알고 있지만 Laravel 5에 대한 효과적인 해결책을 찾지 못했습니다. Codeigniter에서 오랫동안 마이그레이션을 시도했지만이 복잡한 설치 프로세스로 인해 계속 벗어날 수 있습니다.

VM을 실행하고 싶지 않습니다. 프로젝트 간을 전환 할 때 어색해 보입니다.

문서 루트를 공용 폴더로 설정하고 싶지 않습니다. 프로젝트 간을 전환 할 때도 어색합니다.

.htaccess mod_rewrite 메소드를 시도했습니다

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

컴파일 된 PHP 줄 7610에 Laravel NotFoundHttpException이 표시됩니다.

얼마 전에 L4를 사용해 보았을 때 공용 폴더의 내용을 루트로 옮기는 방법을 사용했습니다. L5의 구조는 매우 다르며 동일한 단계를 수행하면 Laravel이 완전히 중단됩니다 (서버는 빈 페이지 만 반환 함).

다음과 같은 개발 환경에서 ‘공개’를 제거하는 적절한 방법이 있습니까?

  1. L5와 호환
  2. 프로젝트를 쉽게 전환 할 수 있습니다 (보통 한 번에 2 개 또는 3 개로 작업하고 있습니다).

감사

** MAMP와 PHP 5.6.2를 사용하고 있습니다



답변

라 라벨 5의 경우 :

  1. server.phpLaravel 루트 폴더의 이름 을index.php
  2. 디렉토리에서 Laravel 루트 폴더로 .htaccess파일을 복사하십시오 /public.

그게 다야!


답변

두 가지 답변을 사용하여 문제를 해결했습니다.

  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]

    다른 정적 파일이 필요한 경우 확장명을 이전에 선언 된 목록에 추가하십시오.


답변

Laravel에서 5.5는 다음 코드를 루트 디렉토리에 .htacess 파일을 생성하고 배치 : – 참조 링크

<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>


답변

하지마!

server.phpLaravel 루트 폴더의 이름을 바꾸 index.php
거나 복사 하지 않아야 합니다..htaccess 거나 /public디렉토리에서 Laravel 루트 폴더로 파일을 합니다 !!!

이렇게하면 모든 사람이 일부 파일에 액세스 할 수 있습니다 (.env 예 :). 직접 해보십시오. 당신은 그것을 원하지 않습니다!


하다

대신 다음 .htaccess과 같이 루트에 파일을 작성해야 합니다.

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

그러면 모든 기본 URI가 /public폴더에 자동으로 다시 작성됩니다 . 모든 헤더 (: HTTP 권한 부여 헤더 ) 및 모든 선택적 URI 매개 변수도 자동으로/public 폴더로 .

그게 다야

Docker를 사용하여 Laravel 프로젝트를 설정할 때 참고하십시오.


답변

laravel 5 url에서 공개를 제거하는 쉬운 방법. 공용 디렉토리에서 index.php와 .htaccess를 잘라내어 루트 디렉토리에 붙여 넣으면 index.php의 두 줄을 다음과 같이 바꿀 수 있습니다.

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

참고 : 위의 방법은 초보자가 가상 ​​호스트를 설정하는 데 문제가있을 수 있으므로 로컬 컴퓨터에서 가상 호스트를 설정하고 프로젝트의 공용 디렉토리를 가리키는 것이 가장 좋습니다.


답변

@ rimon.ekjon는 말했다 :

Laravel 루트 폴더에서 server.php의 이름을 index.php로 바꾸고 .htaccess 파일을 / public 디렉토리에서 Laravel 루트 폴더로 복사하십시오. -그게 다야! 🙂

그것은 나를 위해 일하고 있습니다. 그러나 asset () 도우미를 사용했기 때문에 / public 디렉토리의 모든 리소스 파일을 찾지 못해 URL을 요청할 수 없었습니다.

/Illuminate/Foundation/helpers.php/asset () 함수를 다음과 같이 변경했습니다.

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

이제 모든 것이 작동합니다 🙂

@ rimon.ekjon과 여러분 감사합니다.


답변

그냥 만들 htaccess로 루트에 파일을하고 여기에이 줄을 추가

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

그게 다야!

위 코드는 루트 public_html 폴더에서 작동합니다. 핵심 laravel 파일이 public_html 폴더 안에 있어야한다고 말한 경우 디렉토리가 public_html / laravelapp / public처럼 보이고 위의 코드를 laravelapp 안에 넣으면 작동하지 않습니다. 따라서 모든 핵심 파일을 public_html에 복사하고 .htaccess 파일을 거기에 두어야합니다.

코드를 서브 디렉토리에 유지하려면 서브 도메인을 작성할 수 있습니다. 그러면이 코드도 작동합니다.