Laravel 5 – URL에서 공개 제거


241

나는 이것이 매우 인기있는 질문이라는 것을 알고 있지만 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를 사용하고 있습니다


1
가이드의 폴더 구조가 저와 다릅니다. 그가 L5를 사용하지 않는다고 생각합니까? Bootstrap / Paths 파일에 대한 변경 사항이 존재하지 않기 때문에 생략했습니다. 프로젝트가 작동하는 것 같습니다. 이것이 괜찮다고 생각하십니까?
user1537360

내 실수 날 L5에 대한 답을 추가 할 수
kamlesh.bar

같은 노력을
기울이지 않음

1
index.php 파일의 경로를 수정하는 것만으로도 작동하는 것 같지만 Laravel을 처음 사용하기 때문에 이것이 안정적이고 안전한지 여부에 대해서는 언급 할 수 없습니다.
user1537360

다른 폴더 / 파일은 문서 루트 아래에 있어야합니다.
Mike Rockétt

답변:


431

라 라벨 5의 경우 :

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

그게 다야!


105
안전하지 않을 수 있으므로 whatchout은 .env사용자가 일반 텍스트로 데이터베이스 비밀번호를 확인하지 않는 한 파일을 요청할 수 없도록하십시오 .)
GabLeRoux

49
루트에서 상대 경로를 사용하여 자산을 참조하는 경우에는 작동하지 않습니다. "/assets/styles.css"등. 서버에 배포하는 가장 좋은 방법을 찾는 데 여전히 어려움을 겪고 있습니다.
Ghazanfar Mir

1
이것은 작동합니다 ...하지만 이것을 사용하면 어떤 결과 / 단점이 있습니까? 많은 사람들이 가상 호스트 설정 또는 파일 수동 복사 등을 제안하고 있습니다. 프로덕션에서도 작동합니까?
Bogz

1
@GabLeRoux가 <Files "log.txt">Order Allow,DenyDeny from all</Files>해결 한 문제를 해결합니다. 지금 안전합니까 아니면 더 위험합니까?
나비

1
@Butterflyit는 서버 구성에 따라 다릅니다. 위는 차단 log.txt합니다. 중요한 데이터를 공개적으로 차단하십시오. Laravel을 사용 하고 설명서를주의 깊게 읽으면 웹 루트 모양이 project/public됩니다. 이 stackoverflow 토론 qa를 살펴보십시오 . 웹 서버를 설정 https://example.com/.env하고 만일의 경우를 위해 시도하십시오 . 암호가 보이면 모든 것이 손상된 것으로 간주하고 모든 암호를 변경하십시오.
GabLeRoux

126

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

  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]

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


1
안녕하세요 @KA_lin. localhost / oap / .env
Fokwa Best

8
흠 ... 시도RewriteRule ^.env - [F,L,NC]
ka_lin

2
또는 <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin

감사합니다 @ka_lin, / public / 통해 액세스를 제거 할 수있는 방법이 있습니까? www.yoursite.com은 작동하지만 www.yoursite.com/public도 작동합니다. 마지막 것을 제거 할 수 있습니까?
adaba

8
그것은 작동하지만 CSS, js 및 이미지가로드되지 않습니다
Chetan Khandla

94

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>

5
가장 좋은 답변! 내 예제에서 유일한 사람은 확실히 더 많은 투표를해야합니다
FiliusBonacci

고마워 이것은 나를 위해 일한다. 그러나 보안 문제가 있는지 여부를 알고 싶습니다.
rahul singh Chauhan

보안 문제에 대해 잘 모르지만 안전해야합니다.
Raham

2
이 규칙은 무엇을 RewriteRule ^ ^$1 [N합니까?
gonzo

이것은 나를 위해 일한 유일한 사람입니다 ... 너무 감사합니다
Arshad Ameen

86

하지마!

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 프로젝트를 설정할 때 참고하십시오.


2
프로덕션에서는 잘 작동하지만 로컬에서는 제안되지 않습니까?
Haritsinh Gohil

2
이것은 완벽하게 작동합니다! 로컬 및 서버 보안 지원에 감사드립니다!
간 샤얌 나 키야

1
안녕하세요, @DerkJanSpeelman 내 호스팅의 하위 폴더에 laravel 파일을 업로드하려고합니다 (example.com/projects/laravel/blog). 방문자는 example.com/projects/laravel/blog/ 블로그 폴더 루트에 코드가있는 .htaccess 파일을 넣고 공용 폴더로 리디렉션하려고합니다. 그러나 작동하지 않습니다. 오류가 발생했습니다 :이 서버에서 요청한 URL / public /을 찾을 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까?
Shovon Das

1
이 답변은 과소 평가되었습니다. 굵게 표시하고 Do n't (강조)하지 않음으로 강조했습니다. 절대적으로 잘 작동합니다.
Varun Ved

2
완벽한 답변
alnassre

43

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

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

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


1
CSS가로드되지 않은 후 bcoz는 모든 CSS가 공개되고 공개가 URL에서 제거됨
Mr. Tomar

1
로드하는 동안 js 또는 css 파일 앞에 "public /"을 넣을 수 있습니다 (예 : Html :: script ( "public / js / ....."); - 그러나 가장 좋은 방법은 가상 호스트가 될 것입니다 ...
무하마드 사 디크

39

@ 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과 여러분 감사합니다.


3
벤더 디렉토리에서 업데이트하지 않기 때문에이 문제를 해결하는 좋은 방법은 아닙니다.
Shadman

1
RewriteRule ^(.*)$ public/$1 [L]이 줄을 제거하여 공용 디렉토리에서 복사 한 .htaccess 파일 에만 추가하면됩니다 RewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman

29

그냥 만들 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 파일을 거기에 두어야합니다.

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


귀하의 답변을 읽기 전에 아래 답변을 받았고 이것이 반드시 답변이 되어야합니다 . 파일 변경 없음 : 간단하고 영리한 규칙.
Brigo

@Raham 현재 URL은 무엇입니까?
Abhinav Saraswat

2
이 신사의 작품 위에 간단한 설명을 추가하고 싶습니다. 위의 코드는 루트 public_html 폴더에서 작동합니다 (문제가 있습니다). 핵심 laravel 파일이 public_html 폴더 안에 있어야한다고 말했지만 위의 코드를 laravelapp 안에 넣으면 내 디렉토리가 public_html / laravelapp / public처럼 보이는 것이 잘못되었습니다. 따라서 모든 핵심 파일을 public_html에 복사하고 .htaccess 파일을 거기에 두어야합니다. laravel에 대한 centOS 및 Cpanel 호스팅을 참조하십시오.
Deepesh Thapa

이 방법을 사용하면 어떤 결함이 있습니까?
Script47

1
나를 위해 매력처럼 일한 나는 cPanel 웹 호스트 만 가지고 있었고 Apache의 RootDirectory를 변경할 수 없었습니다. 감사 ! 가장 간단하고 안전합니다. 루트 폴더 내용을 볼 수 없습니다
Vincent Decaux

27

만들기 .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
나는이 해결책을 정말로 추천한다.
TheLastCodeBender 2018 년

1
또한이 솔루션 추천
iglesiasedd

정말 고맙습니다. 이것은 완전하다 (y)
Prappo Islam Prince

3
잘 작동하지만 여전히 URL에서 직접 액세스 할 수있는 .env 파일입니다.
Manoj Singh

안전한 솔루션입니까?
Sr. PHP 프로그래머 팀장

23

1) L5 에서 공용 디렉토리를 이동하는 작동 방법을 찾지 못했습니다 . 부트 스트랩에서 몇 가지 사항을 수정할 수 있지만index.php 몇 가지 도우미 기능은 해당 공용 디렉토리가 있다는 가정을 기반으로합니다. 솔직히 공개 디렉토리를 옮기지 말아야합니다.

2) MAMP 를 사용하는 경우 각 프로젝트에 대해 새 가상 호스트를 작성해야하며 각 프로젝트는 해당 공용 디렉토리를 제공합니다. 생성되면 다음과 같이 정의 된 서버 이름으로 각 프로젝트에 액세스합니다.

http://project1.dev
http://project2.dev

15

공개 를 제거 할 수 있습니다laravel5에서 URL . 다음과 같이하세요:

1 단계. 공공 에서 모든 파일을 복사하고 루트 디렉토리에 붙여 넣습니다.

2 단계. index.php파일 열기

 require __DIR__.'/../bootstrap/autoload.php';

 require __DIR__.'/bootstrap/autoload.php';

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

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

그리고 모든 캐시와 쿠키를 제거하십시오.


안녕하세요, 귀하의 방법을 시도했지만 위의 단계를 수행했지만 다음 오류가 표시됩니다. 경고 : require_once (D : \ Projects \ laravel / public / index.php) : 스트림을 열지 못했습니다 : D에 해당 파일이나 디렉토리가 없습니다. 21 행의 \ Projects \ laravel \ server.php 치명적인 오류 : require_once () : 'D : \ Projects \ laravel / public / index.php'를 여는 데 실패했습니다 (include_path = '.; C : \ xampp \ php \ PEAR' ) D : \ Projects \ laravel \ server.php의 21 행
Ali Shahzad

이것은 완벽한 대답이 아니라 훨씬 안전하지 않은 방법입니다.
Rohit

11

다른 모든 파일과 디렉토리를 'locale'이라는 폴더에 배치했다고 가정 해 봅시다.

여기에 이미지 설명을 입력하십시오

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

11

Laravel 5.5의 경우 2018 년 5 월 현재 가장 효과적이고 짧은 솔루션입니다.

  1. .htaccess파일을 / public 디렉토리에서 루트 디렉토리로 잘라내서 내용을 다음 코드로 바꾸십시오.

    <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파일을 저장하면 됩니다.

  3. server.php파일 이름을로 바꾸십시오 index.php. 모두 즐길 수 있습니다!


9

최선의 접근법 : 내가 대신 대중를 제거하는 것을 권장하지 않습니다 on local computer create a virtual host point to public directoryon remote hosting change public to public_html and point your domain to this directory. 이유는 전체 라 라벨 코드가 공개 디렉토리까지 한 수준 아래 있기 때문에 안전합니다. :)

방법 1 :

난 그냥 이름을 바꿉니다 server.phpindex.php 작동합니다.

방법 2 :

이것은 모든 라 라벨 버전에서 잘 작동합니다 ...

여기 내 디렉토리 구조가 있습니다.

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

이 쉬운 단계를 따르십시오

  1. 모두 움직여 파일을 공용 디렉토리에서 루트 / laravel /으로 이동
  2. 이제 공용 디렉토리가 필요 없으므로 선택적으로 제거 할 수 있습니다
  3. 이제 index.php를 열고 다음을 대체하십시오.

DIR 필요합니다 . '/ .. / bootstrap / autoload.php';

DIR 필요합니다 . '/ bootstrap / autoload.php';

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

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

  1. 이제 bootstrap / paths.php를 열고 공개 디렉토리 경로를 변경하십시오.

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

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

그리고 그게 다야, 이제 http : // localhost / laravel /


괜찮습니다. 그러나 artisan 명령이 작동하지 않고 "입력 파일을 열 수 없습니다 : artisan"이라고 표시됩니다. 어떤 제안이 있습니까?
Kabir Hossain

이 방법은 데이터베이스 자격 증명을 사용자에게 공개해도 괜찮은 경우에 효과적입니다. localhost / laravel / .env
MasoodUrRehman

8

URL에서 공개를 제거하는 가장 좋은 4 가지 방법

다른 트릭을 사용하여 URL에서 공개를 제거하는 경우 server.php의 이름을 index.php로 변경하고 코어 파일 경로로 변경하십시오. 분명히하지 마십시오. 그렇다면 Laravel이 적절한 해결책이 아니기 때문에 이와 같은 솔루션을 제공하지 않는 이유는 무엇입니까?

1) Laravel에서 htaccess를 사용하여 URL에서 공개 제거

루트에 .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>

2) 로컬에 가상 호스트를 만들어 공개를 제거하십시오.

Window 운영 체제에 대한 데모를 제공합니다. 그러나 누구나 쉽게 단계를 수행 할 수 있도록 단계를 정의하려고합니다. 특정 운영 체제에 대해 동일한 것을 Google에서 조사 할 수도 있습니다.

1 단계 : C : \ Windows \ system32 \ drivers \ etc \로 이동하여 "hosts"파일을 관리자 모드로 엽니 다.

2 단계 : 다음 코드를 추가하십시오. 여기서는 projectname.local 도메인 이름 데모 데모를 제공하며 원하는대로 지정할 수 있습니다. 모든 장소에서 일정하게 유지하십시오.

127.0.0.1  projectname.local

3 단계 : 이제 C:\xampp\apache\conf\extraxampp 사용자 및 wamp 사용자 "C:\wamp\bin\apache\Apache2.4.4\conf\extra"및 열린 "httpd-vhosts.conf"파일로 이동하십시오. 이제 다음 코드를 추가하십시오.

참고 : 프로젝트에 따라 문서 루트를 변경하면 "호스트"파일에 정의한대로 도메인 이름도 추가됩니다.

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

4 단계 : 마지막으로 중요한 단계는 Xampp 또는 Wamp를 다시 시작하고 URL과 같은 URL에 액세스하는 http://projectname.local것입니다. Laravel은 공개 URL없이 응답합니다.


3) Laravel에서 명령을 실행하여 공개를 제거하십시오

로컬에서 작업하는 경우 터미널 또는 명령 줄 도구에서 다음 명령을 실행하기 만하면됩니다. 그런 다음 명령 줄에서 제공 한 URL로 웹 사이트에 액세스 할 수 있습니다.

   > php artisan serve

특정 IP에서 프로젝트를 기꺼이 실행하려면 다음 명령을 실행해야합니다. LAN에서 작업하는 경우 다른 사람이 로컬에서 웹 사이트에 액세스 할 수있게하려면 명령에 따라 IP 주소를 실행 한 후 "ipconfig"를 실행하여 명령 줄을 사용하여 IP 주소를 확인하면됩니다.

> php artisan serve --host=192.168.0.177

특정 포트가있는 특정 IP에서 프로젝트를 실행하려면 다음 명령이 필요합니다.

> php artisan serve --host=192.168.0.177 --port=77

4) 호스팅 된 서버 또는 cpanel에서 공개 제거

여기에 이미지 설명을 입력하십시오

프로젝트를 완료 한 후에는 서버에서 프로젝트를 호스팅해야하며 도메인의 문서 루트를 공용 폴더로 설정하면됩니다. 아래 스크린 샷을 확인하십시오.

스크린 샷에 따라 public_html에 프로젝트 폴더가 없으면 문서 루트를 다음과 같이 설정하면 "public_html/public"됩니다.

여기 에서 가져온 참조


1
네 가지 방법이 모두 좋지만 첫 번째 솔루션을 사용하여 문제를 해결했습니다.
Manisha

7

@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

XAMPP 사용자가 laravel 기본 파일 시스템을 건드리지 않고 URL에서 공개를 제거하려면 응용 프로그램이 가상 호스트를 설정하여 jsut을 수행하십시오.

  1. XAMPP 제어판 애플리케이션을 열고 Apache를 중지하십시오. 최신 Windows 시스템에서는 서비스로 실행될 수 있으므로 Apache 모듈 왼쪽의 상자를 선택하십시오.

  2. C:/xampp/apache/conf/extraXAMPP 파일이있는 곳이나 어디든지 탐색 하십시오.

  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 , 여기서 hosts는 파일입니다. 메모장으로여십시오.
  2. #localhost 이름 확인이 DNS 자체에서 처리되는지 확인하십시오.

127.0.0.1 localhost

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를 다시 시작하고 모든 것을 테스트하십시오.

원본 기사는 여기 에서 찾을 수 있습니다


5

라 라벨 설정에 공용 폴더가 있어야하는 이유는 항상 있습니다. 모든 공용 관련 항목은 공용 폴더 안에 있어야합니다.

IP 주소 / 도메인을 Laravel의 루트 폴더로 지정하지 말고 공용 폴더로 지정하십시오. 서버 Ip를 루트 폴더로 가리키는 것은 안전하지 않습니다.에 제한을 쓰지 않으면 .htaccess다른 파일에 쉽게 액세스 할 수 있기 때문 입니다.,

.htaccess파일에 다시 쓰기 조건을 쓰고 다시 쓰기 모듈을 설치하고 다시 쓰기 모듈을 활성화하면 경로에 공개를 추가하는 문제가 해결됩니다.


3

나는이 문제에 대한 많은 해결책이라는 것을 알고 있습니다. 가장 좋고 쉬운 방법은 루트 디렉토리 에 .htaccess 파일 을 추가 하는 것 입니다.

나는 우리 가이 문제에 대해 제공 한 답변을 시도했지만 Laravel의 auth : api guard와 관련된 문제에 직면했습니다.

업데이트 된 솔루션은 다음과 같습니다.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    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>

루트 디렉토리에 .htaccess 파일을 작성하고이 코드를 추가하십시오. 그리고 모든 것이 올바르게 진행됩니다.


2

라 라벨 5.5

Laravel을 처음 설치 한 후, 나는 유명한 "공용 폴더 문제"에 직면했고이 솔루션을 내 개인적인 견해 로는 "깨끗한"것이 아니라 웹에서 찾은 다른 것입니다.


업적

  • publicURI에 단어가 없습니다
  • .env호기심 많은 사람들 로부터 파일을 보호하십시오

.htaccess사용 mod_rewrite및 4 가지 간단한 규칙을 편집하기 만하면됩니다.


단계

  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]

편집 : Abhinav Saraswat 의 해결책을 놓쳤 으며 그의 대답은 받아 들여야합니다. 파일을 수정하지 않고 모든 트래픽을 공용 폴더로 리디렉션하는 하나의 간단하고 명확한 규칙입니다.


2

먼저이 단계를 사용할 수 있습니다

라 라벨 5의 경우 :

1. Laravel 루트 폴더에서 server.php의 이름을 index.php로 바꾸십시오.

2. .htaccess 파일을 / public 디렉토리에서 Laravel 루트 폴더로 복사하십시오.

출처 : https://stackoverflow.com/a/28735930

이 단계를 수행 한 후에는 모든 CSS 및 스크립트 경로를 변경해야하지만 이는 지칠 것입니다.

솔루션 제안 : 간단히 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);
    }

2
규칙 번호 1 : 코어 파일을 편집하지 마십시오. 지금은 쉽고 멋져 보이더라도 나중에 지불합니다.
Janaka Dombawela

@JanakaDombawela 나는 그렇게 생각하지 않습니다 :
Ferhat KOÇER

@JanakaDombawela 나는 그렇게 생각하지 않기 때문에 : Senerio 1 : 개발자 경험이있는 경우 : 오픈 소스 코드는이 직업을위한 것입니다 Senerio 2 : 개발자가 주니어 인 경우 개발자는 경험을 얻기 위해 소스 코드를 편집해야합니다
Ferhat KOÇER

2
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 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]
</IfModule>

다음과 같이 mod_rewrite 모듈을 활성화하십시오

sudo a2enmod rewrite

아파치를 다시 시작

sudo service apache2 restart

.htaccess 파일 내에서 mod_rewrite를 사용하려면 (일반적인 사용 사례) 다음을 사용하여 기본 VirtualHost를 편집하십시오.

sudo nano /etc/apache2/sites-available/000-default.conf

"DocumentRoot / var / www / html"아래에 다음 행을 추가하십시오.

<Directory "/var/www/html">
AllowOverride All
</Directory>

서버를 다시 시작하십시오.

sudo service apache2 restart

1

나는 전에 기사를 읽었고 잘 작동하지만 실제로 안전하지 않은지 모른다

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

1

루트 폴더에 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>

이것은 내가해야 할 빠른 수정이었습니다. 그래서 누구나 그것을 업그레이드 할 수 있습니다.


1

문제는 / public을 입력해도 여전히 URL에서 사용할 수 있기 때문에 public / index.php에 수정 사항을 작성했습니다.

  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

이 코드의 평화는 URL에서 공개를 제거하고 404를 제공 한 다음 공개없이 URL로 리디렉션합니다.


0

내가 사용하는 또 다른 방법은 htdocs 또는 www의 ln 명령을 사용하여 기호 링크 (Linux에서는 Win에 대해 알지 못함)를 만드는 것입니다. 즉 ln projectname/public project , 사이트는 localhost / project를 통해 액세스 할 수 있습니다


0

다양한 방법으로 URL에서 공개 키워드를 제거 할 수 있습니다.

1) 전용 호스팅을 사용 중이고 루트 액세스 권한이있는 경우 가상 호스트를 사용하여 URL에서 공개 키워드를 제거 할 수 있습니다. 공개적으로 DocumentRoot 경로를 제공해야합니다. 따라서 이것은 공개 디렉토리에서 색인을 시작하고 URL에서 제거합니다.

<VirtualHost *:80>
    ServerAdmin info@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2) 호스팅의 루트 액세스 권한이없는 경우 루트 디렉토리에 새 .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>

여기에서 더 많은 참조 를 얻을 수 있습니다 .


0

루트 디렉토리에 .htaccess 파일을 만들고 아래와 같은 코드를 배치하십시오.

<IfModule mod_rewrite.c>
 #Session timeout

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

/ public 디렉토리에 .htaccess 파일을 만들고 아래와 같은 코드를 배치하십시오.

<IfModule mod_rewrite.c>
  <IfModule mod_negotiation.c>
    Options -MultiViews -Indexes
  </IfModule>

RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# 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]
</IfModule>

-1

이 문제에 대한 가장 효과적인 해결책을 찾았습니다.

루트 폴더 .htaccess에서 편집 하고 다음 코드를 작성하십시오. 다른 것은 필요하지 않습니다

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

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>

-1

나는 여기에 몇 가지 해결책을 시도하고 다음과 같이 laravel 5.2에서 작동하는 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 ^ server.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

금지 할 다른 파일이나 폴더가있는 경우 추가하면됩니다.

RewriteRule ^your_file - [F,L,NC]

-1

많은 것을 할 필요가 없습니다. 루트 디렉토리에 .htaccess 파일을 만들고 아래를 붙여 넣거나 저장하십시오.

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

이것은 / public / public으로 이동합니다
zanderwar

@zanderwar, Laravel 버전은 무엇입니까? 또한 기본 디렉토리의 하위 디렉토리에 프로젝트가 없기를 바랍니다.
빅터 Ifeanyi Ejiogu

프로젝트는 루트이고 버전은 5.6입니다. *-공유 호스팅의 하위 도메인에 있습니다. 불행히도이 cPanel 설치는 하위 도메인이 public_html 내에 폴더를 갖도록합니다
zanderwar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.