URL 생성 Laravel에서“public / index.php”를 제거하려면 어떻게해야합니까?


91

Laravel에서 생성 된 URL 을 제거 index.php하거나 제거해야합니다 public/index.php. 일반적으로 경로는 localhost/public/index.php/someWordForRoute다음과 같아야합니다.localhost/someWordForRoute.

.htaccess

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

RewriteEngine On

# Redirect Trailing Slashes.
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php[L]

app / config / app.php

'url' => 'http://localhost',

어떻게 변경할 수 있습니까?


7
Laravel의 예쁜 URL . mod_rewrite활성화되어 있는지 확인하십시오 .
Kryten 2014 년


@Kryten 작동하지 않음 = /
TuGordoBello

2
이것은 다른 솔루션이 작동하지 않을 때의 솔루션입니다. dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello

문서 루트가 의도 한 폴더를 가리키고 있습니까? 즉/var/www/project_name/public
Kiee 2014 년

답변:


130

옵션 1 : .htaccess 사용

아직없는 경우 Laravel 루트 디렉터리에 .htaccess 파일을 만듭니다. .htaccessLaravel 루트 디렉토리가 아직없는 경우 파일을 만듭니다 . (일반적으로 public_html폴더 아래에 있음 )

다음 코드를 포함하도록 .htaccess 파일을 편집하십시오.

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

이제 "/public/index.php/"부분없이 웹 사이트에 액세스 할 수 있습니다.

옵션 2 : '/ public'디렉토리의 항목을 루트 디렉토리로 이동

루트 디렉터리에 새 폴더를 만들고 공용 폴더를 제외한 모든 파일과 폴더를 이동합니다. 원하는대로 부를 수 있습니다. "laravel_code"를 사용하겠습니다.

다음으로 모든 것을 공용 디렉터리에서 루트 폴더로 이동합니다. 결과는 다음과 비슷합니다. 여기에 이미지 설명 입력

그런 다음 laravel_code/bootstrap/paths.php파일과 파일 의 위치를 ​​편집하기 만하면 index.php됩니다.

에서 것은 laravel_code/bootstrap/paths.php코드의 다음 줄을 찾습니다

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../public',

그리고 다음과 같이 변경하십시오.

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../',

에서 index.php다음 줄을 찾습니다.

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

그리고 다음과 같이 변경하십시오.

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

출처 : Laravel의 URL에서 / public /을 제거하는 방법


5
데비안 리눅스를 사용하는 경우, 편집하는 것을 잊지 마세요 etc/apache2/apache2.conf에서 변화 AllowOverride NoneAllowOverride All, 당신은 디렉토리 설정을 참조 곳 <Directory /var/www/></Directory>.
Robin Hood

1
.htaccess 파일을 내 루트 디렉토리에 저장하기 만하면됩니다.
Mário Rodrigues

8
/ root로 이동하는 것은 프로덕션 모드에서 전혀 좋은 조언이 아닙니다! 공용 폴더가 존재하는 이유있다
toesslab

다시 쓰기 규칙이 작동하는지 확인하려면 아파치 구성 <Directory ...구성에 다음 AllowOverride All'과 같은 내용이 있는지 확인하십시오 . <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri-inkalimeva

호스팅에 대한 conf 액세스가 없으면 어떻게합니까?
피터

40

나는 Laravel 4.2에서 이것을 시도했습니다.

server.phpLaravel 루트 폴더의 이름을로 바꾸고 디렉토리에서 Laravel 루트 폴더로 파일을 index.php복사 합니다..htaccess/public

나는 그것이 효과가 있기를 바랍니다


1
Luazan이 수락 한 답변이 작동하지 않으면 이것으로 충분합니다. 사용자가 해당 링크로 바로 이동하면 공용 폴더에서 index.php 파일을 편집하여 사용자를 공용에서 리디렉션해야합니다.
Brad Bird

4
js 및 css 파일이 공용 폴더에서 더 이상로드되지 않습니다
llioor

@MaHDyfo-왜 안전하지 않습니까? 그리고 어떻게 ?
151291

2
@ 151291 모든 사람이 액세스 할 수있는 .env 파일이 이러한 방식으로 사이트를 방문하기 때문입니다. 이를 방지하기 위해 웹 서버를 보호하지 않는 한.
Mahdyfo

17

내가 사용하고있는 아래 스 니펫의 다른 옵션과 혼동하지 마십시오. 루트에 아래 htacces를 넣으십시오.

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

공용 디렉토리로 이동하여 아래 코드 조각과 함께 다른 htaccess 파일을 넣으십시오.

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php from ExpressionEngine URLs  
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

</IfModule>

작동 중 ... !!!

.htaccess 아래의 Laravel 사용

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

좋습니다.이 방법의 장단점을 말씀해 주시겠습니까?
무하마드 Ateek

나는 루트 (첫 번째 스 니펫)에서 .htaccess 만 편집했으며 저를 위해 수정되었습니다. 감사합니다!
만료

13

URL (Laravel 5)에서 공개를 제거하는 간단한 단계는 다음과 같습니다.

1 : 공용 폴더에서 모든 파일을 복사하여 laravel 루트 폴더에 붙여 넣습니다.

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

laravel 4에서 경로 2는 $app = require_once __DIR__.'/bootstrap/start.php';대신$app = require_once __DIR__.'/bootstrap/app.php';/app.php

그게 다입니다.


사이트에서 다른 링크와 관련하여 다른 합병증이 있습니까?
Haring10

그것은 훌륭한 솔루션처럼 보이고 또한 간단합니다. 그러나 실제로 Haring10이 말했듯이. 이것에 문제가 있습니까?
피터

10

1) mod_rewrite가 활성화되어 있는지 확인하십시오. /etc/apache2/mods-enabled디렉토리로 이동 하여 rewrite.load가 사용 가능한지 확인하십시오 . 그렇지 않은 경우 명령 sudo a2enmod rewrite을 사용하여 활성화합니다. 다시 쓰기 모듈을 활성화합니다. 이미 활성화 된 경우 메시지가 표시됩니다 Module rewrite already enabled.
2) 공개 디렉토리에 대한 가상 호스트를 만들어주는 대신 http://localhost/public/index.php우리가 그런 식으로 사용할 수 있도록합니다 http://example.com/index.php. [따라서 공용 폴더 이름이 숨겨집니다]
3) 그런 다음 루트 디렉토리 (공용 폴더) 내에있는 URL에서 index.php를 숨길 .htaccess를 만듭니다.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

1
당신의 단계를 시도했습니다. 아직 결과가 없습니다! 왜 이런 일이 일어나는지 모르겠어요!
Mostafiz Rahman 2014

근본 원인을 추적 할 수 있도록 로그 정보 제공
Orchid

전체 로그 파일은 다음과 같습니다. dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Mostafiz Rahman

나를 위해 일했습니다. 가상 호스트를 공용 폴더로 바로 이동하지 마십시오.
cardi777

감사합니다. 이것은 나를 위해 일했고 나의 mod_rewrite장애가있었습니다.
Maubeh

5

이것은 Laravel 및 Apache 구성과 관련된 모든 것과 관련이 거의 없습니다.

Apache 서버 구성에 대한 액세스 권한이 있습니까? 그렇다면 문서에서 이것을 확인하십시오.

일반적으로 주 서버 구성 파일에 액세스 할 수없는 경우에만 .htaccess 파일을 사용해야합니다. 예를 들어, 사용자 인증은 항상 .htaccess 파일에서 수행되어야한다는 일반적인 오해가 있으며, 최근에는 mod_rewrite 지시문이 .htaccess 파일에 있어야한다는 또 다른 오해가 있습니다. 이것은 사실이 아닙니다. 주 서버 구성에 사용자 인증 구성을 넣을 수 있으며, 실제로 이것이 작업을 수행하는 데 선호되는 방법입니다. 마찬가지로, mod_rewrite 지시문은 여러 측면에서 주 서버 구성에서 더 잘 작동합니다.

... 일반적으로 .htaccess 파일의 사용은 가능하면 피해야합니다. .htaccess 파일에 넣는 것을 고려하는 모든 구성은 주 서버 구성 파일의 섹션에서와 마찬가지로 효과적으로 만들 수 있습니다.

출처 : Apache 문서 .

제가 이것을 먼저 언급 한 이유는 .htaccess가능하면 완전히 제거 하고 Directory태그 안에 태그를 사용하는 것이 최선이기 때문입니다 VirtualHost. 즉, 나머지는 .htaccess어떤 이유로 든 경로를 고수하고 있다고 가정합니다 .

이를 분석하기 위해 몇 가지 일이 발생할 수 있습니다.

  1. 귀하의 파일이 .htacces귀하의 질문에 이름이 지정 되어 있다는 점은 의미가 없습니다 . 제 생각에는 오타이지만 간과하고 실제로 두 번째 s가 누락 된 경우에는 더 어려운 것을 찾고 벽에 머리를 두드리는 일종의 사소한 오류입니다. .

  2. 서버에서을 (를) 허용 할 수 없습니다 .htaccess. 이를 확인하려면 Apache 구성 파일로 이동하십시오. 최신 Apache 빌드에서는 일반적으로 하나의 구성 파일이 아니므로 앱이있는 위치에 관계없이 앱을 가리키는 파일을 사용하고 있는지 확인하십시오. 변화

    AllowOverride none
    

    ...에

    AllowOverride all
    

    후속 조치로 Apache 문서는 보안상의 이유로 .htaccess재 작성 을 위해 모든 폴더에 대해이 작업을 수행하지 않도록 권장합니다 . 대신 추가해야하는 폴더에 대해 수행하십시오 .htaccess.

  3. 당신은 마 mod_rewrite활성화? 그것은 문제를 일으킬 수 있습니다. 상단에 태그가 <IfModule mod_rewrite.c>있습니다. 해당 태그를 주석 처리하고 Apache를 다시 시작하십시오. 오류가 발생하면 다음을 활성화해야하기 때문일 수 있습니다 mod_rewrite. Apache 2.2에 대해 mod_rewrite를 활성화하는 방법

도움이 되었기를 바랍니다. 가장 일반적인 문제 중 일부를 명명했지만 더 평범하거나 독특 할 수있는 몇 가지 다른 문제가 있습니다. 개발 서버에 대한 또 다른 제안? Apache를 다시 설치하십시오. 가능한 경우 좋은 튜토리얼을 통해 다른 소스에서 수행하십시오.


apache2 구성 설정에 대한 대단한 캐치, 매번이 설정이 그립습니다.
Abhishek

4

Laravel 4 및 5의 경우 :

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

그게 다야! :)



1

Laravel은 이미 예쁜 URL .htaccess와 함께 제공됩니다 ... 즉시 사용하는 것이 좋습니다 ... http://laravel.com/docs/installation#pretty-urls

mod_rewrite가 활성화되어 있고 홈 경로가 애플리케이션의 공용 디렉토리로 설정되어 있는지 확인하십시오.


내가 활성화 mod_rewrite하고 그 페이지에있는 코드를 복사했지만 여전히 작동하지 않습니다
TuGordoBello

1
Apache에서 경로가 애플리케이션의 공용 폴더로 설정되어 있는지 확인하십시오.
Kisuka

ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello

mod_rewrite를 활성화 한 후 아파치를 다시 시작 했습니까?
Kisuka

내가라는 폴더 user가 내가 사진을 보관하는 곳이고, 또한라는 블레이드 파일 user이 있습니다. URL에 쓸 때 myproject.com/user폴더의 내용, 사진이 표시됩니다
TuGordoBello

1

이 작업을 수행하려면 다음 단계를 수행해야합니다.

  • 프로젝트의 공용 폴더 (예 : / var / www / html / yourproject / public)까지 도메인 매핑 (Linux를 사용하는 경우)

  • 공용 폴더로 이동하여 .htaccess파일을 편집하십시오.

AddHandler application/x-httpd-php72 .php
<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 non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect non-http to https
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

    # Remove index.php
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>


  • 마지막 세 가지 규칙은를 사용하지 않고 경로에 직접 액세스하는 https경우이를 보호하는 것입니다.

0
 RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d

 RewriteRule ^(.*)$ index.php/$1 [L]

.htaccess에서 이것을 사용하고 서버를 다시 시작하십시오.


0

이것이 나를 위해했던 것처럼 도움이되기를 바랍니다.

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

0

방금 프로젝트를 위해 Laravel 5를 설치했으며 루트에 server.php.

그것을 변경하면 index.php작동하거나 터미널에 입력합니다.

$cp server.php index.php

0

server.phpLaravel 루트 폴더의 이름을로 바꾸고 디렉토리에서 Laravel 루트 폴더로 파일을 index.php복사 합니다..htaccess/public



0

IIS Windows Server를 사용하는 경우 web.config루트 폴더 에 파일을 추가 하고 아래 코드를 넣으십시오.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^system.*" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt|css)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

그리고 .htaccess 이것을 사용한다면 :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]


-3

당으로 Laravel 5.3 일 위가 제대로 작동하지만 진정하십시오 및 이하의 절차되지 않습니다 :

1 단계. laravel 프로젝트 내부로 이동합니다
. 2 단계. 임의의 디렉토리 / 폴더를 만듭니다. laravelcode의
3 단계로 이동하는 모든 폴더와 (제외 파일 공용 폴더)
4 단계로 이동하는 모든 내부에있는 폴더와 파일을 공개 laravel 프로젝트에 폴더
의 index.php 파일이있는 laravel 프로젝트 내부에 이제 5 단계, 제발 그것을 열고 이전과 같이 새 경로에 따라 부트 스트랩의 폴더 경로를 변경하십시오 . "require DIR . '/ .. / bootstrap / autoload.php';" 이제 "require DIR . '/ laravelcode / bootstrap / autoload.php';"가됩니다.

http : // localhost / blog / 와 같이 public 및 index.php없이 URL을 실행하는 것입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.