Laravel 5 - ลบสาธารณะออกจาก URL


241

ฉันรู้ว่านี่เป็นคำถามที่ได้รับความนิยมมาก แต่ฉันไม่สามารถหาวิธีแก้ปัญหาการทำงานสำหรับ Laravel 5 ได้ฉันได้พยายามโยกย้ายจาก Codeigniter มาเป็นเวลานาน แต่กระบวนการติดตั้งที่ซับซ้อนนี้ทำให้ฉันต้องหยุดทำงาน

ฉันไม่ต้องการเรียกใช้ VM นี่เป็นเรื่องที่น่าอึดอัดใจเมื่อต้องสลับระหว่างโครงการ

ฉันไม่ต้องการตั้งค่ารูทเอกสารของฉันไปยังโฟลเดอร์สาธารณะสิ่งนี้น่าอึดอัดใจเช่นกันเมื่อสลับระหว่างโครงการ

ฉันได้ลองใช้วิธี. htaccess mod_rewrite แล้ว

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

นี่แค่ให้ Laravel NotFoundHttpException ของฉันใน compiled.php บรรทัดที่ 7610

เมื่อฉันลอง L4 สักพักหนึ่งฉันใช้วิธีการย้ายเนื้อหาของโฟลเดอร์สาธารณะไปยังรูท โครงสร้างของ L5 ค่อนข้างแตกต่างและทำตามขั้นตอนเดียวกันทั้งหมด Laravel ที่ไม่สมบูรณ์ (เซิร์ฟเวอร์จะส่งคืนหน้าเปล่าเท่านั้น)

มีวิธีที่ดีในการลบ 'สาธารณะ' ในสภาพแวดล้อมการพัฒนาที่:

  1. ทำงานร่วมกับ L5
  2. ทำให้ฉันสามารถสลับระหว่างโครงการต่างๆได้อย่างง่ายดาย (โดยปกติฉันจะทำงาน 2 หรือ 3 ในแต่ละครั้ง)

ขอบคุณ

** ฉันใช้ MAMP และ PHP 5.6.2


1
โครงสร้างโฟลเดอร์ในคู่มือต่างจากของฉันฉันคิดว่าเขาไม่ได้ใช้ L5 ใช่ไหม ฉันละเว้นการเปลี่ยนแปลงที่เขาทำกับไฟล์ Bootstrap / Paths เนื่องจากไม่มีอยู่ ดูเหมือนว่าโครงการจะทำงานได้ คุณคิดว่ามันโอเคไหม
user1537360

ความผิดพลาดของฉันให้ฉันเพิ่มคำตอบสำหรับ L5
kamlesh.bar

ไม่ประสบความสำเร็จในการพยายามเหมือนกัน
kamlesh.bar

1
ดูเหมือนว่าจะทำงานได้โดยเพียงแค่ปรับเปลี่ยนเส้นทางในไฟล์ index.php แต่ฉันใหม่กับ Laravel ดังนั้นจึงไม่สามารถให้ความเห็นได้อย่างชัดเจนว่านี่มีเสถียรภาพ / ปลอดภัยหรือไม่
user1537360

โฟลเดอร์ / ไฟล์อื่น ๆ ควรอยู่ใต้รูทเอกสารของคุณ
Mike Rockétt

คำตอบ:


431

สำหรับ Laravel 5:

  1. เปลี่ยนชื่อserver.phpในโฟลเดอร์ราก Laravel ของคุณเป็นindex.php
  2. คัดลอก.htaccessไฟล์จาก/publicไดเรกทอรีไปยังโฟลเดอร์ราก Laravel ของคุณ

แค่นั้นแหละ!


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 และอ่านเอกสารอย่างละเอียด webroot ของคุณจะมีลักษณะเช่นproject/publicนี้ มีลักษณะไปQA สนทนานี้ StackOverflow ติดตั้งเว็บเซิร์ฟเวอร์ของคุณและลองhttps://example.com/.envในกรณี หากคุณเห็นรหัสผ่านของคุณให้พิจารณาทุกสิ่งที่ถูกบุกรุกและเปลี่ยนรหัสผ่านทั้งหมด
GabLeRoux

126

ฉันได้แก้ไขปัญหาโดยใช้ 2 คำตอบ:

  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 ฉันจะป้องกันไม่ให้ใครบางคนดู. env อย่างไร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

ขอบคุณนี่ใช้งานได้สำหรับฉัน แต่ฉันต้องการที่จะรู้ว่ามันมีปัญหาด้านความปลอดภัยหรือไม่
ราหุล singh ชัวฮาน

@hululsinghChauhan ความสุขของฉันที่รักฉันไม่รู้เกี่ยวกับปัญหาด้านความปลอดภัย แต่มันควรจะปลอดภัย
Raham

2
กฎนี้RewriteRule ^ ^$1 [N] ทำอะไร
gonzo

นี่เป็นเพียงคนเดียวที่ทำงานให้ฉัน ... ขอบคุณมาก
Arshad Ameen

86

ทำไม่ได้!

จริงๆคุณไม่ควรเปลี่ยนชื่อserver.phpในโฟลเดอร์ราก Laravel ของคุณindex.php และคัดลอก.htaccessไฟล์จาก/publicไดเรกทอรีไปยังโฟลเดอร์ราก Laravel ของคุณ !!!

วิธีนี้ทุกคนสามารถเข้าถึงไฟล์บางไฟล์ของคุณ ( .envตัวอย่าง) ลองด้วยตัวคุณเอง คุณไม่ต้องการที่!


ทำ

แต่คุณควรสร้าง.htaccessไฟล์ในรูทของคุณดังนี้:

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

สิ่งนี้จะเขียน URI ฐานทั้งหมดของคุณไปยัง/publicโฟลเดอร์ แม้แต่ส่วนหัวทั้งหมดเช่นHTTP Authorization Headerและพารามิเตอร์ URI ที่เป็นตัวเลือกทั้งหมดจะถูกส่งต่อไปยัง/publicโฟลเดอร์ด้วยเช่นกัน

นั่นคือทั้งหมดที่

โปรดทราบเมื่อตั้งค่าโครงการ Laravel ด้วย Docker: คุณไม่จำเป็นต้องทำเช่นนี้


2
มันทำงานได้ดีในการผลิต แต่มันไม่ทำงานในท้องถิ่นข้อเสนอแนะใด ๆ ?
Haritsinh Gohil

2
มันทำงานได้อย่างสมบูรณ์แบบ! ท้องถิ่นและเซิร์ฟเวอร์ขอขอบคุณสำหรับความช่วยเหลือด้านความปลอดภัย!
Ghanshyam Nakiya

1
สวัสดี @DerkJanSpeelman ฉันพยายามอัปโหลดไฟล์ laravel ของฉันภายในโฟลเดอร์ย่อยในโฮสติ้งของฉันเช่น: (example.com/projects/laravel/blog) ในกรณีนั้นผู้เข้าชมต้องไปที่ example.com/projects/laravel/blog/ สาธารณะเพื่อให้ฉันใส่ไฟล์. htaccess ด้วยรหัสของคุณในรูทโฟลเดอร์บล็อกและต้องการให้เปลี่ยนเส้นทางไปยังโฟลเดอร์สาธารณะ แต่มันไม่ทำงาน นี่คือข้อผิดพลาดที่เกิดขึ้น: ไม่พบ URL / สาธารณะ / ที่ร้องขอบนเซิร์ฟเวอร์นี้ ฉันจะแก้ปัญหานี้อย่างไร
Shovon Das

1
คำตอบนี้ถูกประเมินค่าน้อยเกินไป อัปโหลดแล้วสำหรับตัวหนาและไฮไลต์อย่า มันทำงานได้ดีอย่างแน่นอน
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
คุณสามารถวาง "public /" ไว้หน้าไฟล์ js หรือ css ขณะทำการโหลดเช่น Html :: script ("public / js / ..... "); - แต่ทางออกที่ดีที่สุดคือโฮสต์เสมือน ...
Muhammad Sadiq

39

@ rimon.ekjon กล่าวว่า:

เปลี่ยนชื่อ server.php ในโฟลเดอร์ราก Laravel ของคุณเป็น index.php และคัดลอกไฟล์. htaccess จาก / ไดเรกทอรีสาธารณะไปยังโฟลเดอร์ราก Laravel ของคุณ -- แค่นั้นแหละ !! :)

ที่ทำงานให้ฉัน แต่ไฟล์ทรัพยากรทั้งหมดใน / ไดเรกทอรีสาธารณะไม่สามารถค้นหาและขอ URL ไม่ได้เพราะฉันใช้ผู้ช่วย asset ()

ฉันเปลี่ยน /Illuminate/Foundation/helpers.php/asset () ฟังก์ชั่นดังนี้:

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

ตอนนี้ทุกอย่างทำงาน :)

ขอบคุณ @ rimon.ekjon และพวกคุณทุกคน


3
นี่ไม่ใช่วิธีที่ดีในการแก้ไขปัญหานี้เนื่องจากคุณพยายามอัปเดตในไดเรกทอรีผู้ขายซึ่งไม่ใช่วิธีปฏิบัติที่ดี
แชดแมน

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>

แค่นั้นแหละ!

โค้ดด้านบนใช้ได้กับโฟลเดอร์ root public_html ต้องบอกว่าไฟล์ laravel หลักของคุณควรอยู่ในโฟลเดอร์ public_html ถ้าไดเรกทอรีของคุณดูเหมือน public_html / laravelapp / พับลิกและถ้าคุณใส่รหัสข้างบนเข้าไปใน laravelapp มันจะไม่ทำงาน ดังนั้นคุณต้องคัดลอกไฟล์หลักทั้งหมดของคุณลงใน public_html และวางไฟล์. htaccess ไว้ที่นั่น

หากคุณต้องการเก็บรหัสไว้ในไดเรกทอรีย่อยคุณสามารถสร้างโดเมนย่อยได้รหัสนี้จะใช้งานได้เช่นกัน


ฉันตอบด้านล่างก่อนอ่านคำตอบของคุณและนี่ต้องเป็นคำตอบที่ยอมรับได้ ไม่มีการเปลี่ยนแปลงไฟล์: เป็นกฎที่ง่ายและฉลาด
Brigo

@Raham url ปัจจุบันของคุณคืออะไร?
Abhinav Saraswat

2
เพียงแค่ต้องการเพิ่มคำอธิบายสั้น ๆ เกี่ยวกับงานของสุภาพบุรุษคนนี้ โค้ดด้านบนใช้ได้กับโฟลเดอร์ root public_html (ฉันมีปัญหาด้วยเช่นกัน) ต้องบอกว่าไฟล์ laravel หลักของคุณควรอยู่ในโฟลเดอร์ public_html ฉันทำผิดพลาดที่ไดเรกทอรีของฉันดูเหมือน public_html / laravelapp / พับลิกถ้าคุณใส่โค้ดข้างต้นลงใน laravelapp มันจะไม่ทำงาน ดังนั้นคุณต้องคัดลอกไฟล์หลักทั้งหมดของคุณลงใน public_html และวางไฟล์. htaccess ไว้ที่นั่น การอ้างอิงถึง centOS และ Cpanel โฮสติ้งสำหรับ laravel
Deepesh Thapa

ข้อบกพร่องในการใช้วิธีนี้คืออะไร
Script47

1
ทำงานเหมือนเสน่ห์สำหรับฉันฉันมี cPanel webshost เท่านั้นและไม่สามารถเปลี่ยน RootDirectory สำหรับ Apache ได้ ขอบคุณมาก! ง่ายและปลอดภัยที่สุด สิ่งนี้จะไม่อนุญาตให้ดูเนื้อหาโฟลเดอร์รูทของคุณ
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

1
ฉันยังแนะนำวิธีแก้ปัญหานี้
iglesiasedd

ขอบคุณมาก. นี่คือสิ่งที่สมบูรณ์แบบ (y)
Prappo Islam Prince

3
มันใช้งานได้ดี แต่ยังคงสามารถเข้าถึงไฟล์. env ได้โดยตรงจาก URL
Manoj Singh

มันเป็นทางออกที่ปลอดภัยหรือไม่
Sr. PHP โปรแกรมเมอร์หัวหน้าทีมนำ

23

1) ฉันไม่ได้พบวิธีการทำงานสำหรับการย้ายไดเรกทอรีของประชาชนในL5 ในขณะที่คุณสามารถปรับเปลี่ยนบางสิ่งใน bootstrapindex.phpมันจะปรากฏขึ้นฟังก์ชั่นผู้ช่วยหลายคนจะขึ้นอยู่กับสมมติฐานของไดเรกทอรีสาธารณะที่มี จริงๆแล้วคุณไม่ควรย้ายไดเรกทอรีสาธารณะ

2) ถ้าคุณใช้MAMPคุณควรสร้าง vhosts ใหม่สำหรับแต่ละโครงการการให้บริการแต่ละโครงการนั้นจะทำไดเรกทอรีสาธารณะ เมื่อสร้างแล้วคุณสามารถเข้าถึงแต่ละโครงการด้วยชื่อเซิร์ฟเวอร์ที่คุณกำหนดดังนี้:

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

15

เป็นไปได้ที่จะลบสาธารณะ URLใน laravel5 ทำตามขั้นตอนเหล่านี้:

ขั้นตอน 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: \ Projects \ laravel \ server.php ในบรรทัด 21 ข้อผิดพลาดร้ายแรง: require_once (): ไม่สามารถเปิดได้ต้อง 'D: \ Projects \ laravel / สาธารณะ / 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

นี่คือทางออกที่ดีที่สุดและสั้นที่สุดที่เหมาะกับฉันตั้งแต่พฤษภาคม 2018 สำหรับ Laravel 5.5

  1. เพียงแค่ตัด.htaccessไฟล์ของคุณจากไดเร็กทอรี/ publicไปยังไดเร็กทอรีrootและแทนที่เนื้อหาด้วยโค้ดต่อไปนี้:

    <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 directory on remote hosting change public to public_html and point your domain to this directoryเหตุผลรหัส laravel ทั้งหมดของคุณจะปลอดภัยเพราะอยู่ในระดับเดียวกับไดเรกทอรีสาธารณะของคุณ :)

วิธีที่ 1:

ฉันเพียงแค่เปลี่ยนชื่อserver.phpไปindex.phpและการทำงาน

วิธีที่ 2:

วิธีนี้ใช้ได้ดีสำหรับ laravel ทุกรุ่น ...

นี่คือโครงสร้างไดเรกทอรีของฉัน

/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

4 วิธีที่ดีที่สุดในการลบสาธารณะออกจาก URL

หากคุณใช้เคล็ดลับอื่น ๆ เพื่อลบพับลิกออกจาก URL เช่นเปลี่ยนชื่อ server.php เป็น index.php และเปลี่ยนเป็นพา ธ ไฟล์หลัก เห็นได้ชัดว่าอย่าทำอย่างนั้น แล้วทำไมลาร์เวลไม่ให้คำตอบเช่นนี้เพราะมันไม่ใช่วิธีที่เหมาะสมในการทำเช่นนั้น

1) ลบสาธารณะออกจาก URL โดยใช้ htaccess ใน Laravel

โดยการเพิ่มไฟล์. 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 \ open ไฟล์ "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 like 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 เพื่อลบสาธารณะออกจาก url โดยไม่ต้องสัมผัสระบบไฟล์เริ่มต้น laravel คือการตั้งค่าโฮสต์เสมือนสำหรับแอปพลิเคชันของคุณเพื่อทำ jsut นี้ทำตามขั้นตอนเหล่านี้

  1. เปิดแอปพลิเคชันแผงควบคุม XAMPP และหยุด Apache โปรดทราบว่าเครื่อง Windows ที่ช้าอาจทำงานเป็นบริการได้ดังนั้นให้ทำเครื่องหมายในช่องทางด้านซ้ายของโมดูล Apache

  2. นำทางไปยังC:/xampp/apache/conf/extraหรือที่ใดก็ตามที่ไฟล์ XAMPP ของคุณตั้งอยู่

  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 ของคุณเพื่อแก้ไขโฮสต์ของคุณ ไฟล์จะอยู่ที่C:/Windows/System32/drivers/etc/hostsซึ่งโฮสต์เป็นไฟล์ เปิดด้วย notepad
  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

มีเหตุผลเสมอที่จะมีโฟลเดอร์สาธารณะในการตั้งค่า Laravel ทุกสิ่งที่เกี่ยวข้องกับสาธารณะควรอยู่ในโฟลเดอร์สาธารณะ

อย่าชี้ที่อยู่ ip / โดเมนของคุณไปยังโฟลเดอร์รูทของ Laravel แต่ชี้ไปที่โฟลเดอร์สาธารณะ มันไม่ปลอดภัยที่จะชี้เซิร์ฟเวอร์ Ip ไปยังโฟลเดอร์รูทเพราะถ้าคุณเขียนข้อ จำกัด คุณ.htaccessสามารถเข้าถึงไฟล์อื่นได้อย่างง่ายดาย

เพียงเขียนเงื่อนไขการเขียนใหม่ใน.htaccessไฟล์และติดตั้งโมดูลการเขียนใหม่และเปิดใช้งานโมดูลการเขียนใหม่ปัญหาที่เพิ่มสาธารณะในเส้นทางจะได้รับการแก้ไข


3

ฉันรู้ว่านี่เป็นวิธีแก้ปัญหาสำหรับปัญหานี้มากมาย ทางออกที่ดีที่สุดและง่ายที่สุดคือการเพิ่มไฟล์. htaccessในไดเรกทอรีราก

ฉันลองคำตอบที่เราให้ไว้สำหรับปัญหานี้ แต่ฉันประสบปัญหาบางอย่างกับการรับรองความถูกต้อง: api guard ใน Laravel

นี่คือโซลูชันที่อัปเดตแล้ว:

<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

Laravel 5.5

หลังจากติดตั้ง Laravel เป็นครั้งแรกฉันได้พบกับ "ปัญหาโฟลเดอร์สาธารณะ" ที่โด่งดังและฉันพบวิธีแก้ปัญหานี้ซึ่งในความเห็นส่วนตัวของฉันคือ "สะอาด" จากนั้นอีกคนที่ฉันพบบนเว็บ


ผู้ชนะ

  • ไม่มีpublicคำใน URI
  • ป้องกัน.envไฟล์จากคนที่สงสัย

ทุกสิ่งสามารถทำได้เพียงแก้ไขการ.htaccessใช้mod_rewriteและกฎง่ายๆสี่ข้อ


ขั้นตอน

  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

ประการแรกคุณสามารถใช้ขั้นตอนนี้

สำหรับ Laravel 5:

1.เปลี่ยนชื่อ server.php ในโฟลเดอร์ราก Laravel ของคุณเป็น index.php

2.คัดลอกไฟล์. htaccess จาก / public directory ไปยังโฟลเดอร์รากของ 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

และรีสตาร์ท apache

sudo service apache2 restart

หากต้องการใช้ mod_rewrite จากภายในไฟล์. htaccess (ซึ่งเป็นกรณีการใช้งานทั่วไป) ให้แก้ไขค่าเริ่มต้น 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 ไว้ในโฟลเดอร์ root แต่ก็มีบางกรณีที่ไม่สามารถหลีกเลี่ยงได้ สำหรับกรณีเหล่านั้นวิธีการด้านบนไม่ทำงานสำหรับเนื้อหาดังนั้นฉันทำการแก้ไขด่วนเปลี่ยน 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

ปัญหาคือถ้าคุณพิมพ์ / พับลิกและจะยังคงอยู่ใน 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

อีกวิธีที่ฉันใช้คือการสร้างลิงค์สัญลักษณ์ (ใน Linux ไม่รู้เกี่ยวกับ Win) โดยใช้คำสั่ง ln ใน htdocs หรือ www ie ln projectname/public project เว็บไซต์จึงเข้าถึงได้ผ่าน localhost / project


0

คุณสามารถลบคำค้นหาสาธารณะออกจาก URL โดยใช้วิธีการต่างๆ

1) หากคุณใช้โฮสติ้งเฉพาะและคุณมีสิทธิ์เข้าถึงรูทคุณสามารถลบคำหลักสาธารณะออกจาก url โดยใช้ Virtual Host คุณควรให้เส้นทาง 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>

สร้างไฟล์. htaccess ใน / public directory และวางโค้ดตามด้านล่าง

<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

ฉันได้ลองวิธีแก้ปัญหาที่นี่และพบ htaccess ที่ใช้งานได้กับ laravel 5.2 เช่นนี้:

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>

สิ่งนี้นำฉันไป / สาธารณะ / สาธารณะ
zanderwar

@zanderwar โปรดรุ่น Laravel อะไร? นอกจากนี้ฉันหวังว่าคุณจะไม่มีโครงการของคุณในไดเรกทอรีย่อยจากไดเรกทอรีหลัก?
Victor Ifeanyi Ejiogu

โครงการคือรูทเวอร์ชันคือ 5.6 * - มันอยู่ในโดเมนย่อย น่าเสียดายที่การติดตั้ง cPanel นี้บังคับให้โดเมนย่อยมีโฟลเดอร์อยู่ใน public_html
zanderwar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.