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이 완전히 중단됩니다 (서버는 빈 페이지 만 반환 함).
다음과 같은 개발 환경에서 '공개'를 제거하는 적절한 방법이 있습니까?
- L5와 호환
- 프로젝트를 쉽게 전환 할 수 있습니다 (보통 한 번에 2 개 또는 3 개로 작업하고 있습니다).
감사
** MAMP와 PHP 5.6.2를 사용하고 있습니다
라 라벨 5의 경우 :
server.php
Laravel 루트 폴더의 이름 을index.php
- 디렉토리 에서
.htaccess
파일을/public
Laravel 루트 폴더로 복사하십시오.
그게 다야!
두 가지 답변을 사용하여 문제를 해결했습니다.
- server.php를 index.php로 이름 바꾸기 (수정 안 됨)
- 공용 폴더에서 루트 폴더로 .htaccess를 복사하십시오 (예 : rimon.ekjon은 아래 언급)
정적 변수의 경우 .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>
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과 여러분 감사합니다.
하지마!
server.php
Laravel 루트 폴더의 이름을 바꾸 거나 디렉토리에서 Laravel 루트 폴더로 파일을 index.php
복사 하지 않아야 합니다 !!!.htaccess
/public
이렇게하면 모든 사람이 일부 파일에 액세스 할 수 있습니다 ( .env
예 :). 직접 해보십시오. 당신은 그것을 원하지 않습니다!
하다
대신 다음 .htaccess
과 같이 루트에 파일을 작성해야 합니다.
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]
그러면 모든 기본 URI가 /public
폴더에 자동으로 다시 작성됩니다 . 모든 헤더 ( 예 : HTTP 권한 헤더 ) 및 모든 선택적 URI 매개 변수도 자동으로 /public
폴더로 전달됩니다 .
그게 다야!
그냥 만들 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 파일을 거기에 두어야합니다.
코드를 서브 디렉토리에 유지하려면 서브 도메인을 작성할 수 있습니다. 그러면이 코드도 작동합니다.
1) L5 에서 공용 디렉토리를 이동하는 작동 방법을 찾지 못했습니다 . 부트 스트랩에서 몇 가지 사항을 수정할 수는 있지만 index.php
몇 가지 도우미 기능은 해당 공용 디렉토리가 있다는 가정을 기반으로합니다. 솔직히 당신은 정말로 공용 디렉토리를 옮기지 말아야합니다.
2) MAMP 를 사용하는 경우 각 프로젝트에 대해 새 가상 호스트를 작성해야하며 각 프로젝트는 해당 공용 디렉토리를 제공합니다. 생성되면 다음과 같이 정의 된 서버 이름으로 각 프로젝트에 액세스합니다.
http://project1.dev
http://project2.dev
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';
그리고 모든 캐시와 쿠키를 제거하십시오.
만들기 .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>
다른 모든 파일과 디렉토리를 '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';
가장 좋은 방법 : 내가 대신 대중를 제거하는 것을 권장하지 않습니다 on local computer create a virtual host point to public directory
와 on remote hosting change public to public_html and point your domain to this directory
. 이유는, 당신의 전체 라 라벨 코드는 공개 디렉토리까지 한 수준 아래 있기 때문에 안전합니다 :)
방법 1 :
방금 이름 server.php
을 바꾸고 index.php
작동합니다.
방법 2 :
이것은 모든 라 라벨 버전에서 잘 작동합니다 ...
여기 내 디렉토리 구조가 있습니다.
/laravel/
... app
... bootstrap
... public
... etc
이 쉬운 단계를 따르십시오
- 모든 파일을 공용 디렉토리에서 루트 / laravel /으로 이동
- 이제 공용 디렉토리가 필요 없으므로 선택적으로 제거 할 수 있습니다
- 이제 index.php를 열고 다음을 대체하십시오.
DIR 필요합니다 . '/ .. / bootstrap / autoload.php';
에
DIR 필요합니다 . '/ bootstrap / autoload.php';
과
$ app = require_once DIR . '/ .. / bootstrap / start.php';
에
$ app = require_once DIR . '/ bootstrap / start.php';
- 이제 bootstrap / paths.php를 열고 공개 디렉토리 경로를 변경하십시오.
'public'=> DIR . '/ .. / public',
에
'public'=> DIR . '/ ..',
그리고 그게 다야, 이제 http : // localhost / laravel /
Laravel 5.5의 경우 2018 년 5 월 현재 가장 효과적이고 짧은 솔루션입니다.
.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>
.htaccess
파일을 저장하면 됩니다.server.php
파일 이름을로 바꾸십시오index.php
. 모두 즐길 수 있습니다!
@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, '/');
}
스크립트, 스타일 및 이미지 경로가 수정됩니다. 자산 경로에 대한 모든 것.
XAMPP 사용자가 laravel 기본 파일 시스템을 건드리지 않고 URL에서 공개를 제거하려면 응용 프로그램이 가상 호스트를 설정하여 jsut을 수행하십시오.
XAMPP 제어판 애플리케이션을 열고 Apache를 중지하십시오. 최신 Windows 시스템에서는 서비스로 실행될 수 있으므로 Apache 모듈 왼쪽의 상자를 선택하십시오.
C:/xampp/apache/conf/extra
XAMPP 파일이있는 곳이나 어디든지 탐색 하십시오.텍스트 편집기로 httpd-vhosts.conf 파일을여십시오.
19 행에서 #을 찾아
NameVirtualHost *:80
해시를 주석 해제하거나 제거하십시오.파일 맨 아래에 다음 코드를 붙여 넣습니다.
<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>
- 이제 아래 코드를 복사하여 붙여 넣어 가상 호스트 디렉토리를 추가 할 수 있습니다. 예를 들어 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>
- 그런 다음 Windows 호스트 파일로 가서 HOSTS를 편집하십시오. 파일은에 위치하며
C:/Windows/System32/drivers/etc/hosts
, 여기서 hosts는 파일입니다. 메모장으로여십시오. - #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.
- Apache를 다시 시작하고 모든 것을 테스트하십시오.
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\extra
xampp 사용자 및 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"
됩니다.
라 라벨 설정에 항상 공용 폴더가 있어야하는 이유가 있습니다. 모든 공용 관련 항목은 공용 폴더 안에 있어야합니다.
IP 주소 / 도메인을 Laravel의 루트 폴더로 지정하지 말고 공용 폴더로 지정하십시오. 서버 Ip를 루트 폴더로 지정하는 것은 안전하지 않습니다.에 제한을 쓰지 않으면
.htaccess
다른 파일에 쉽게 액세스 할 수 있기 때문 입니다.,
.htaccess
파일에 다시 쓰기 조건을 작성 하고 다시 쓰기 모듈을 설치하고 다시 쓰기 모듈을 활성화하면 경로에 공개를 추가하는 문제가 해결됩니다.
나는 전에 기사를 읽었고 잘 작동하지만 실제로 안전하지 않은지 모른다
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';
먼저이 단계를 사용할 수 있습니다
라 라벨 5의 경우 :
1. Laravel 루트 폴더에서 server.php의 이름을 index.php로 바꾸십시오.
2. .htaccess 파일을 / public 디렉토리에서 Laravel 루트 폴더로 복사하십시오.
출처 : https://stackoverflow.com/a/28735930
이 단계를 수행 한 후에는 모든 CSS 및 스크립트 경로를 변경해야하지만 이것은 지칠 것입니다.
솔루션 제안 : 간단히 helpers::asset
기능 을 약간 변경할 수 있습니다.
이를 위해 :
열다
vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
고토 선 130
쓰기
"public/".$path
대신에$path
,function asset($path, $secure = null){ return app('url')->asset("public/".$path, $secure); }
<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
내가 사용하는 또 다른 방법은 htdocs 또는 www의 ln 명령을 사용하여 기호 링크 (Linux에서는 Win에 대해 알지 못함)를 만드는 것입니다. 즉 ln projectname/public project
, 사이트는 localhost / project를 통해 액세스 할 수 있습니다
루트 폴더에 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>
이것은 내가해야했던 빠른 수정이었습니다. 그래서 누구나 업그레이드 할 수 있습니다.
라 라벨 5.5
Laravel을 처음 설치 한 후, 나는 유명한 "공용 폴더 문제"에 직면했고이 솔루션을 생각해 보았습니다. 개인적으로 볼 때 웹에서 찾은 다른 것보다 "깨끗한"것입니다.
업적
public
URI에 단어가 없습니다.env
호기심 많은 사람들 로부터 파일을 보호하십시오
.htaccess
사용 mod_rewrite
및 4 가지 간단한 규칙을 편집하기 만하면됩니다.
단계
- 기본 루트에서
.htaccess
파일을 이동하십시오.public/.htaccess
- 아래와 같이 편집
나는 모든 것을 언급 했으므로 결코 사용 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 의 해결책을 놓쳤 으며 그의 대답은 받아 들여야합니다. 파일을 수정하지 않고 모든 트래픽을 공용 폴더로 리디렉션하는 하나의 간단하고 명확한 규칙입니다.
문제는 / 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로 리디렉션합니다.
다양한 방법으로 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>
여기서 더 많은 참조 를 얻을 수 있습니다 .
이 문제에 대한 가장 효과적인 해결책을 찾았습니다.
루트 폴더 .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>
나는 여기에 몇 가지 해결책을 시도하고 다음과 같이 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]
많은 것을 할 필요는 없습니다. 루트 디렉토리에 .htaccess 파일을 만들고 아래를 붙여 넣기 / 저장하십시오.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
이 줄을 루트 htaccess 폴더에 추가하십시오.
RewriteEngine on
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]
참고 URL : https://stackoverflow.com/questions/28364496/laravel-5-remove-public-from-url
'IT story' 카테고리의 다른 글
iTunes Connect 스크린 샷 모든 iOS (iPhone / iPad / Apple Watch) 장치의 크기 (0) | 2020.04.30 |
---|---|
Linux 용 C ++ IDE? (0) | 2020.04.30 |
C ++ std :: string이 특정 문자열로 시작하고 하위 문자열을 int로 변환하는지 어떻게 확인합니까? (0) | 2020.04.30 |
Android ListView 행의 추가 또는 제거에 애니메이션을 적용하는 방법 (0) | 2020.04.30 |
안드로이드에서 사용자의 위치를 얻는 좋은 방법 (0) | 2020.04.30 |