Laravel 5 - Herkese Açık URL'yi Kaldır


241

Bunun çok popüler bir soru olduğunu biliyorum, ancak Laravel 5 için çalışan bir çözüm bulamadım. Codeigniter'den uzun süredir göç etmeye çalışıyorum, ancak bu kıvrımlı kurulum süreci beni erteliyor.

Bir VM çalıştırmak istemiyorum, projeler arasında geçiş yaparken bu sadece garip görünüyor.

Belge kökümü ortak klasöre ayarlamak istemiyorum, bu da projeler arasında geçiş yaparken garip.

.Htaccess mod_rewrite yöntemini denedim

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

Bu sadece compiled.php satır 7610 Laravel NotFoundHttpException verir.

Bir süre önce L4'ü denediğimde, ortak klasörün içeriğini köke taşıma yöntemini kullandım. L5'in yapısı oldukça farklıdır ve aynı adımları takip ederek Laravel'i tamamen kırdı (sunucu sadece boş bir sayfa döndürür).

Bir geliştirme ortamında 'kamuoyunun' kaldırılması için iyi bir yöntem var mı:

  1. L5 ile çalışır
  2. Projeler arasında kolayca geçiş yapmama izin veriyor (genellikle aynı anda 2 veya 3 üzerinde çalışıyorum).

Teşekkürler

** MAMP ve PHP 5.6.2 kullanıyorum


1
Rehberdeki klasör yapısı benimkinden farklı, L5 kullanmadığını hayal ediyorum? Bootstrap / Paths dosyasında yaptığı değişiklikleri atladım çünkü mevcut değil. Proje çalışıyor gibi görünüyor. Sence bu iyi mi?
user1537360

hatam L5 için cevap eklememe izin ver
kamlesh.bar

aynı için çalışıyor
kamlesh.bar

1
Sadece index.php dosyasındaki yolları değiştirerek çalışıyor gibi görünüyor, ancak Laravel için yeniyim, bu yüzden kararlı / güvenli olup olmadığı konusunda yorum yapamıyorum.
user1537360

Diğer klasörlerin / dosyaların belge kökünüzün altında olması gerekir.
Mike Rockétt

Yanıtlar:


431

Laravel 5 için:

  1. server.phpLaravel kök klasörünüzde yeniden adlandırınindex.php
  2. Kopya .htaccessdosyayı /publicsizin laravel kök klasörüne dizininde.

Bu kadar!


105
Bu güvenli olmayabilir .env, veritabanı parolanızı açık metin olarak görüntüleyen kişilerle sorun yoksa, kimse bunu yapamazsa emin olun ;)
GabLeRoux

49
Varlıklarınızı kökten göreli yolu kullanarak başvuruyorsanız, bu işe yaramaz. "/assets/styles.css" vb. Hala sunucular üzerinden dağıtmanın en iyi yolunu bulmakta zorlanıyorum
Ghazanfar Mir

1
Bu işe yarıyor ... Ama bunu kullanmanın herhangi bir sonucu / dezavantajı var mı? Birçoğu sanal ana bilgisayar kurmayı veya dosyaları manuel olarak kopyalamayı vb. Öneriyor ... Bu da üretimde çalışıyor mu?
Bogz

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>, ele aldığınız sorunu çözer. Şimdi güvenli mi yoksa daha fazla risk var mı?
Kelebek

1
@Butterflyit sunucu yapılandırmanıza bağlıdır. Yukarıdaki sadece engeller log.txt. Hassas verileri herkesten engellediğinizden emin olun. Laravel'i kullanır ve belgeleri dikkatlice okursanız, webrootunuz gibi görünecektir project/public. Bu yığın akışı tartışma qa'ya bir göz atın . Web sunucunuzu kurun ve https://example.com/.envher ihtimale karşı deneyin . Şifrelerinizi görürseniz, güvenliği ihlal edilen her şeyi göz önünde bulundurun ve tüm şifreleri değiştirin.
GabLeRoux

126

Sorunu 2 cevap kullanarak çözdüm:

  1. Server.php dosyasını index.php olarak yeniden adlandırma (değişiklik yok)
  2. .Htaccess dosyasını ortak klasörden kök klasöre kopyalayın (rimon.ekjon aşağıda belirtildiği gibi)
  3. .Htaccess öğesini statik olarak aşağıdaki gibi değiştirin:

    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]
    

    Gerekli başka statik dosyalar varsa , uzantıyı önceden bildirilen listeye ekleyin


1
merhaba @KA_lin. Birinin böyle localhost / oap / .env
Fokwa Best

8
Hmmm ... tryRewriteRule ^.env - [F,L,NC]
ka_lin

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

@Ka_lin, teşekkürler / public / üzerinden erişimi kaldırmak için herhangi bir yolu var mı? www.yoursite.com gibi ama www.yoursite.com/public gibi de çalışıyor, sonuncuyu kaldırmak mümkün mü?
adaba

8
Çalışıyor ama css, js ve görüntüler yüklenmiyor
Chetan Khandla

94

Laravel 5.5'te kök dizininizde .htacess dosyası oluşturun ve aşağıdaki kodu yerleştirin: - Referans Bağlantısı

<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
en iyi cevap! benim
örneğimde

Teşekkürler bu benim için iş. Ancak güvenlik sorunu olup olmadığını bilmek istiyorum.
rahul singh Chauhan

Güvenle ilgili bir şey bilmiyorum ama güvenli olmalı.
Raham

2
Bu kural ne RewriteRule ^ ^$1 [Nişe yarar?
gonzo

Bu benim için çalıştı sadece ... çok teşekkür ederim
Arshad Ameen

86

DO DEĞİL!

GERÇEKTENserver.php Laravel kök klasörünüzde yeniden adlandırmamalısınız index.php ve .htaccessdosyayı dizinden Laravel kök klasörünüze kopyalamalısınız /public!!!

Bu şekilde herkes dosyalarınızdan bazılarına erişebilir ( .envörneğin). Kendin dene. Bunu istemiyorsun!


YAPMAK

Bunun yerine kökünüzde şöyle bir .htaccessdosya oluşturmanız gerekir :

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

Bu, tüm temel URI'lerinizi sessizce /publicklasöre yeniden yazacaktır . Hatta tüm Başlıkları , örneğin HTTP Yetkilendirme Başlığı ve isteğe bağlı tüm URI parametreleri sessizce için geçirilir /publicklasörün de.

Bu kadar

Docker ile bir Laravel projesi oluştururken lütfen bunu yapmanıza gerek olmadığını unutmayın.


2
Üretimde iyi çalışıyor ama yerel olarak herhangi bir öneri çalışmıyor mu?
Haritsinh Gohil

2
Bu mükemmel çalışıyor! yerel ve sunucu güvenlik yardımı için teşekkürler!
Ghanshyam Nakiya

1
Merhaba, @DerkJanSpeelman Benim laravel dosyalarımı hostingimdeki bir alt klasör içine yüklemeye çalışıyorum: (example.com/projects/laravel/blog) bu durumda ziyaretçiler example.com/projects/laravel/blog/ adresini ziyaret etmelidir. Genel olarak, blogunuzun kök dizinine kodunuzla birlikte bir .htaccess dosyası koydum ve bunun ortak klasöre yönlendirilmesini istiyorum. Ama işe yaramıyor. Gerçekleşen Hata: İstenen URL / genel / bu sunucuda bulunamadı. Bunu Nasıl Çözebilirim ?
Shovon Das

1
Bu cevabın önemsiz olduğu anlaşılıyor. Bold ve vurgulanan Yapma için seçildi. Kesinlikle iyi çalışıyor.
Varun Ved

2
Mükemmel Cevap
alnassre

43

Laravel 5 url kamu kaldırmak için kolay yolu. Sadece index.php ve .htaccess'i genel dizinden kesip kök dizine yapıştırmanız yeterlidir, hepsi bu ve index.php içindeki iki satırı

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

Not : Yukarıdaki yöntem sadece yeni başlayanlar içindir, çünkü sanal ana bilgisayar kurulumunda sorunla karşılaşabilirler ve En iyi çözüm sanal ana makineyi yerel makinede kurmak ve projenin genel dizinine yönlendirmektir.


1
Sonra bu css yüklenmez, bcoz tüm css halka açık ve kamu url kaldırıldı
Bay Tomar

1
Yükleme sırasında js veya css dosyalarının önüne "public /" koyabilirsiniz, örn. Html :: script ("public / js / ....."); - Ama en iyi çözüm sanal ev sahibi olurdu ...
Muhammed Sadiq

39

@ rimon.ekjon dedi:

Laravel kök klasörünüzdeki server.php dosyasını index.php olarak yeniden adlandırın ve .htaccess dosyasını / public dizininden Laravel kök klasörünüze kopyalayın. -- Bu kadar !! :)

Benim için çalışıyor. Ancak / public dizinindeki tüm kaynak dosyaları bulamadı ve istek URL'leri çalışmadı, çünkü asset () yardımcısını kullandım.

/Illuminate/Foundation/helpers.php/asset () işlevini aşağıdaki gibi değiştirdim:

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

Şimdi her şey çalışıyor :)

@ Rimon.ekjon ve hepinize teşekkür ederim.


3
Bu, iyi bir uygulama olmayan satıcılar dizininde güncellemeye çalıştığınız için bu sorunu çözmek için iyi bir yol değildir.
Shadman

1
yalnızca RewriteRule ^(.*)$ public/$1 [L]bu dizini kaldırarak genel RewriteRule ^(.*)/$ /$1 [L,R=301]
dizinden

29

Kökte .htaccess dosyası oluşturun ve bu satırları buna ekleyin

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Bu kadar!

Yukarıdaki kod, root public_html klasöründe çalışır. Çekirdek laravel dosyanızın public_html klasörü içinde olması gerektiğini söyledikten sonra, dizininiz public_html / laravelapp / public gibi görünüyorsa ve yukarıdaki kodu laravelapp içine koyarsanız çalışmaz. Bu nedenle, tüm temel dosyalarınızı public_html dosyasına kopyalamalı ve .htaccess dosyasını oraya koymalısınız.

Kodu bir alt dizinde tutmak istiyorsanız, bir alt alan adı oluşturabilirsiniz, o zaman bu kod bunun için de çalışır.


Cevabınızı okumadan önce aşağıda cevap verdim ve bu kabul edilen cevap olmalı . Dosya değişikliği yok: sadece basit ve akıllı bir kural.
Brigo

@Raham mevcut URL'niz nedir?
Abhinav Saraswat

2
Sadece bu beyefendinin çalışmalarına kısa bir açıklama eklemek istiyorum. Yukarıdaki kod kök public_html klasöründe çalışır (Ben de sorunları vardı). Çekirdek laravel dosyanızın public_html klasörü içinde olması gerektiğini söyledikten sonra, yukarıdaki kodu laravelapp içinde çalışmayacaksa koyarsanız dizinimin public_html / laravelapp / public gibi göründüğü bir hata yaptım. Bu nedenle, tüm temel dosyalarınızı public_html dosyasına kopyalamalı ve .htaccess dosyasını oraya koymalısınız. Laravel için centOS ve Cpanel barındırma referans.
Deepesh Thapa

Bu yöntemi kullanmanın kusurları nelerdir?
Script47

1
Benim için bir cazibe gibi çalıştı, sadece cPanel webshost vardı ve Apache için RootDirectory değiştiremedi. Teşekkürler ! en basit ve en güvenli. Bu, kök klasör içeriğinizi görmenize izin vermez
Vincent Decaux

27

Kök dizinde .htaccessdosya oluşturun ve aşağıdaki gibi bir kod yerleştirin.

<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
Bu çözümü gerçekten tavsiye ederim.
TheLastCodeBender

1
Ben de bu çözümü tavsiye
iglesiasedd

Çok teşekkür ederim. Bu mükemmel (y)
Prappo İslam Prensi

3
iyi çalışıyor, ancak yine de .env dosyasına doğrudan URL'den erişilebilir.
Manoj Singh

güvenli bir çözüm mü?
PHP Programcısı Ekip Lideri

23

1) L5'te ortak dizini taşımak için bir çalışma yöntemi bulamadım . Bootstrap'teki bazı şeyleri değiştirebilmenize rağmen index.php, birkaç yardımcı fonksiyonun, o genel dizinin orada olduğu varsayımına dayalı olduğu görülmektedir. Dürüst olmak gerekirse, gerçekten genel dizini hareket etmemelisiniz.

2) MAMP kullanıyorsanız , her proje için yeni vhostlar oluşturmalısınız, her biri bu ortak dizini yansıtır. Oluşturulduktan sonra, her bir projeye aşağıdaki gibi tanımlanmış sunucu adıyla erişirsiniz:

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

15

Laravel5'teki genel URL'yi kaldırmak mümkündür . Bu adımları takip et:

tüm dosya 1.Copy adım kamu ve yapıştırmak kök dizininde

adım 2. açık index.phpdosya ile değiştir

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

için

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

ve

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

için

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

Ve tüm önbellek ve çerezleri kaldırın.


Merhaba, yönteminizi denedim, yukarıdaki adımları gerçekleştirdim, ancak aşağıdaki hataları gösterir: Uyarı: requir_once (D: \ Projects \ laravel / public / index.php): akış açılamadı: D'de böyle bir dosya veya dizin yok: \ Projects \ laravel \ server.php on line 21 Önemli hata: requir_once (): Açılma başarısız 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) D: \ Projects \ laravel \ server.php satırında 21
Ali Shahzad

Bu mükemmel bir cevap değil, daha güvenli bir yol.
Rohit

11

Diğer tüm dosyaları ve dizinleri 'locale' adlı bir klasöre yerleştirdiğinizi varsayalım.

resim açıklamasını buraya girin

Sadece index.php adresine gidin ve şu iki satırı bulun:

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

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

ve bunları şu şekilde değiştirin:

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

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

11

İşte Laravel 5.5 için Mayıs 2018 itibariyle benim için çalışan en iyi ve en kısa çözüm

  1. Sadece kesip .htaccessdosyayı / kamu dizinden kök dizinine ve dosyaya aşağıdaki kodla içeriği değiştirin:

    <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. Sadece .htaccessdosyayı kaydedin ve hepsi bu.

  3. server.phpDosyanızı yeniden adlandırın index.php. hepsi zevk!


9

EN İYİ Yaklaşım: yerine kamu kaldırılmasını tavsiye etmeyeceğim on local computer create a virtual host point to public directoryve on remote hosting change public to public_html and point your domain to this directory. Nedeni, tüm laravel kodunuz güvenli olacak çünkü bir seviye genel dizininize indirilecek :)

YÖNTEM 1:

Sadece adlandırmak server.phpiçin index.phpve işe yarıyor

YÖNTEM 2:

Bu, tüm laravel sürümü için iyi çalışır ...

İşte benim Dizin Yapım,

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

Bu kolay adımları izleyin

  1. tüm dosyaları ortak dizinden root / laravel / dizinine taşıyın
  2. Şimdi, genel dizine gerek yok, bu yüzden isteğe bağlı olarak şimdi kaldırabilirsiniz
  3. Şimdi index.php dosyasını açın ve aşağıdaki değişiklikleri yapın

DIR gerektirir . '/ .. / bootstrap / autoload.php';

için

DIR gerektirir . '/ bootstrap / autoload.php';

ve

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

için

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

  1. Şimdi bootstrap / paths.php dosyasını açın ve genel dizin yolunu değiştirin:

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

için

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

ve hepsi bu, şimdi http: // localhost / laravel /


Her şey için ok. ancak artisan komutu çalışmıyor, sadece "Giriş dosyası açılamadı: artisan" gösteriyor. Herhangi bir öneriniz var mı?
Kabir Hossain

Bu yöntem işe yaradı, veritabanı kimlik bilgilerinizi kullanıcılara göstermeye uygunsanız. localhost / laravel / .env
MasoodUrRehman

8

URL'yi herkese açık olarak kaldırmanın 4 en iyi yolu.

URL'yi genel URL'den kaldırmak için başka bir numara kullandıysanız, server.php adını index.php olarak değiştirir ve çekirdek dosya yoluna geçer. Açıkçası bunu yapma. Öyleyse Laravel neden çözümü böyle vermiyor çünkü bunu yapmak için uygun bir yol değil.

1) Laravel'de htaccess kullanarak herkesi URL'den kaldırın

Köke bir .htaccess dosyası ekleyerek, web sitesine herkese açık olmadan erişebilirsiniz

<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) Yerelinizde sanal bir ana bilgisayar oluşturarak halkı kaldırın

Burada Windows işletim sistemi için demo veriyorum. Ama herkesin adımı kolayca takip edebilmesi için bir adım tanımlamaya çalışacağım. Ayrıca, belirli bir işletim sistemi için aynı şeyi Google'da da araştırabilirsiniz.

Adım 1: C: \ Windows \ system32 \ drivers \ etc \ dizinine gidin ve "hosts" dosyasını Yönetici modunda açın.

Adım 2: Aşağıdaki kodu ekleyin. Burada size projectname.local alan adı demosunun bir demosunu veriyorum, istediğiniz gibi belirtebilirsiniz. Sadece her yerde sabit yap.

127.0.0.1  projectname.local

Adım 3: Şimdi C:\xampp\apache\conf\extraxampp kullanıcıları ve wamp kullanıcısı için gidin "C:\wamp\bin\apache\Apache2.4.4\conf\extra"ve "httpd-vhosts.conf"dosyayı açın . Şimdi içine aşağıdaki kodu ekleyin.

Notlar: "Kökler" dosyasında tanımladığınız şekilde, alan adınızı projenize göre değiştirin.

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

Adım 4: Son fakat önemli adım Xampp veya Wamp'inizi yeniden başlatmak ve URL'ye erişmek gibi http://projectname.local. Laravel'iniz genel URL olmadan yanıt verecektir.


3) Laravel'de komutu çalıştırarak halkı kaldırın

Yerel olarak çalışıyorsanız, hiçbir şey yapmanız gerekmez, sadece terminalinizden veya komut satırı aracınızdan aşağıdaki komutu çalıştırmanız gerekir. Bundan sonra, komut satırından sağlanan URL ile web sitenize erişebilirsiniz.

   > php artisan serve

Projenizi belirli bir IP üzerinde çalıştırmak istiyorsanız, aşağıdaki komutu çalıştırmanız gerekir. LAN üzerinde çalışıyorsanız, diğer kişilerin web sitenize yerelden erişmesine izin vermek istiyorsanız, IP adresinizi komutun ardından çalıştırdıktan sonra "ipconfig" komutunu kullanarak IP adresinizi komut satırını kullanarak kontrol etmeniz yeterlidir.

> php artisan serve --host=192.168.0.177

Projenizi belirli bir port ile belirli bir IP üzerinde çalıştırmak istiyorsanız, aşağıdaki komuta ihtiyacınız vardır.

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

4) Barındırılan sunucudaki veya cpanel'deki genel durumu kaldırın

resim açıklamasını buraya girin

Projeyi tamamladıktan sonra, projeyi sunucuda barındırmanız gerekir, o zaman alan adınızdaki belge kökünü ortak klasöre ayarlamanız gerekir. Aşağıdaki ekran görüntüsünü kontrol edin.

Ekran görüntüsüne göre public_html içinde herhangi bir proje klasörünüz yoksa, doküman kökünüzü ayarlamanız yeterlidir "public_html/public".

Buradan alınan referans


1
Dört yol da iyidir, ancak ilk çözümü kullanarak sorunumu çözdüm.
Manisha

7

@Humble Öğrenen eklemek ve varlıkların url yolu "düzeltmek" için uygun konum /Illuminate/Routing/UrlGenerator.php/asset () olduğunu unutmayın.

Eşleşecek yöntemi güncelleyin:

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, '/');
}

Bu, komut dosyalarını, stilleri ve görüntü yollarını düzeltir. Varlık yolları için her şey.


6

XAMPP kullanıcısı laravel varsayılan dosya sistemine dokunmadan genel url kaldırmak için uygulamanız için bir Sanal Ana ayarlamak için bu jsut yapmak aşağıdaki adımları izleyin

  1. XAMPP kontrol paneli uygulamasını açın ve Apache'yi durdurun. Geç Windows makinelerinin bir hizmet olarak çalıştırabileceğini unutmayın, bu yüzden Apache modülünün solundaki kutuyu işaretleyin.

  2. Gezinin C:/xampp/apache/conf/extraveya XAMPP dosyaları yerlerde bulunur.

  3. Httpd-vhosts.conf adlı dosyayı bir metin düzenleyicisiyle açın.

  4. 19. satır civarında # bulun NameVirtualHost *:80ve karmayı kaldırın veya kaldırın.

  5. Dosyanın en altına aşağıdaki kodu yapıştırın:

<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. Şimdi Sanal Ana Bilgisayar dizinlerinizi eklemek için yukarıdaki kodu kopyalayıp yapıştırabilirsiniz. Örneğin, aşağıdaki kod parçası yerel yüklememde alt etki alanlarıyla çalışmama izin verecek şekilde Eatery Engine adlı bir sitede çalışıyorum:
<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. Ardından, HOSTS'nizi düzenlemek için Windows host dosyanıza gidin. dosya, C:/Windows/System32/drivers/etc/hostshostların dosya olduğu yerde bulunur . Not Defteri ile açın.
  2. #Localhost ad çözümlemesinin DNS içinde ele alındığına bakın.

127.0.0.1 localhost

localhost ad çözümlemesi DNS içinde işlenir.

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'yi yeniden başlatın ve her şeyi test edin.

Orijinal makale burada bulunabilir


5

Laravel kurulumunda her zaman ortak bir klasör bulundurmanın bir nedeni vardır, genel olarak ilgili tüm öğeler ortak klasörde bulunmalıdır,

IP adresinizi / alan adınızı Laravel'in kök klasörüne yönlendirmeyin, ancak ortak klasöre yönlendirin. Ip sunucusunu kök klasöre işaret etmek güvenli değildir, çünkü kısıtlamalar .htaccessyazmazsanız, diğer dosyalara kolayca erişebilirsiniz.,

Sadece .htaccessdosyaya yeniden yazma koşulu yazın ve yeniden yazma modülünü yükleyin ve yeniden yazma modülünü etkinleştirin, rotaya genel ekleyen sorun çözülecektir.


3

Bunun bu konuda çok fazla çözüm olduğunu biliyorum. En iyi ve en kolay çözüm, kök dizine .htaccess dosyası eklemektir .

Bu konuda verdiğimiz cevapları denedim, ancak Laravel'de auth: api guard ile ilgili bazı sorunlarla karşılaştım.

Güncellenmiş çözüm:

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

Kök dizininizde .htaccess dosyasını oluşturun ve bu kodu ekleyin. Ve her şey yolunda gidiyor


2

Laravel 5.5

Laravel'i ilk kez kurduktan sonra, ünlü "ortak klasör sorunu" ile karşı karşıya kaldım ve kişisel görüşüme göre Web'de bulduğum diğerlerinden "daha temiz" olan bu çözümü buldum.


Başarılar

  • publicURI'de kelime yok
  • .envDosyayı meraklı insanlara karşı koruyun

Her şey sadece .htaccesskullanarak düzenleme mod_rewriteve dört basit kural yapılabilir.


adımlar

  1. .htaccessDosyayı public/.htaccessana kök dizinine taşıyın
  2. Aşağıdaki gibi düzenleyin

Her şeyi yorumladım, bu yüzden hiç kullanmamış olanlara da (umarım) açık olmalı ( mod_rewritebir uzman değilim, tam tersi). Ayrıca kurallarını anlamak için, laravel içinde Bill bağlanıyorsa, açıkça olmalıdır https://example.com, https://example.com/index.phpyüklenir. Bu dosya sadece header("refresh: 5; https://example.com/public/")isteği gönderen komutu içerir https://example.com/public/index.php. Bu saniye index.phpdenetleyiciyi ve diğer şeyleri yüklemekle sorumludur.

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

Aşağıdaki kural (başlangıçta içinde public/.htaccess) silinebilir. Aynı kural, aslında, son iki kuralda daha ayrıntılı bir şekilde açıklanmaktadır.

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

EDIT: Abhinav Saraswat'ın çözümünü kaçırdım ve cevabı kabul edilmiş olmalı. Herhangi bir dosyayı değiştirmeden tüm trafiği ortak klasöre yönlendiren tek, basit ve anlaşılır bir kural.


2

Öncelikle bu adımları kullanabilirsiniz

Laravel 5 için:

1. Laravel kök klasörünüzdeki server.php dosyasını index.php olarak yeniden adlandırın

2. .htaccess dosyasını / public dizininden Laravel kök klasörünüze kopyalayın.

Kaynak: https://stackoverflow.com/a/28735930

Bu adımları izledikten sonra tüm css ve komut dosyası yolunu değiştirmeniz gerekir, ancak bu yorucu olacaktır.

Çözüm Önerisi : basitçe helpers::assetişlevi küçük bir değişiklik yapabilirsiniz .

Bunun için :

  1. açık vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. 130 numaralı satıra git

  3. "public/".$pathyerine yazmak $path,

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

2
Kural numarası 1: Asla bir çekirdek dosyayı düzenlemeyin. Şimdi kolay ve güzel görünse bile, daha sonra ödeyeceksiniz.
Janaka Dombawela

@JanakaDombawela öyle düşünmüyorum çünkü:
Ferhat KOÇER

@JanakaDombawela Ben öyle düşünmüyorum çünkü: Senerio 1: Eğer geliştirici deneyimli: Açık kaynak kodu bu iş için Senerio 2: Geliştirici bir geneyse, geliştirici kazanım deneyimi için kaynak koduna düzenleme yapmalıdır
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 modülünü

sudo a2enmod rewrite

ve apache'yi yeniden başlatın

sudo service apache2 restart

.Htaccess dosyalarından mod_rewrite kullanmak için (bu çok yaygın bir kullanım örneğidir), varsayılan VirtualHost'u

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

"DocumentRoot / var / www / html" altına aşağıdaki satırları ekleyin:

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

Sunucuyu yeniden başlatın:

sudo service apache2 restart

1

Daha önce bazı makaleler okudum ve iyi çalışıyor ama gerçekten güvenli olduğunu bilmiyorum

    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. 

İndex.php dosyasını düzenleyin

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

için

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

1

Laravel'i kök klasöre koymayı önermesem bile, önlenemediği bazı durumlar vardır; bu durumlarda yukarıdaki yöntemler varlıklar için çalışmaz, bu yüzden hızlı bir düzeltme htaccess değiştirme yaptı: server.php kopyaladıktan sonra index.php .htaccess dosyasını şöyle düzenleyin:

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

Bu herkes yükseltmek için bekliyoruz böylece yapmak zorunda hızlı bir düzeltme oldu.


1

Sorun / public yazarsanız ve yine de url'de mevcut olacaksa, bunun için public / index.php'ye yerleştirilmesi gereken bir düzeltme oluşturdum.

  $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;
   }}

bu kod huzuru halkı url'den kaldıracak ve 404 verecek ve daha sonra halkı olmadan url'ye yönlendirecektir.


0

Kullandığım başka bir yöntem, htdocs veya www'deki ln komutunu kullanarak (Linux'ta Win, bilmiyorum) sembolik bir bağlantı oluşturmaktır ln projectname/public project . Siteye localhost / project aracılığıyla erişilebilir


0

Herkese açık anahtar kelimeyi çeşitli yöntemler kullanarak URL'den kaldırabilirsiniz.

1) Özel barındırma kullanıyorsanız ve root erişiminiz varsa, Sanal Ana Bilgisayar'ı kullanarak genel anahtar kelimeyi URL'den kaldırabilirsiniz. DocumentRoot yolunu herkese açık olarak vermelisiniz. Böylece bu dizin genel dizinden başlayacak ve url'den kaldırılacaktır.

<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) Barındırma sisteminize root erişiminiz yoksa, kök dizininizde yeni bir .htaccess dosyası oluşturmalı ve kodu aşağıdaki gibi koymalısınız

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

Burada daha fazla referans alabilirsiniz .


0

Kök dizinde .htaccess dosyası oluşturun ve kodu aşağıdaki gibi bir yere yerleştirin.

<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 dizininde .htaccess dosyası oluşturun ve kodu aşağıdaki gibi bir yere yerleştirin.

<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

Bu soruna en iyi çözümü buldum.

Sadece Düzenlemenizle .htaccessiçinde kök klasörüne ve aşağıdaki kodu yazmak. Başka bir şey gerekli değil

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

Burada bazı çözüm denemek ve laravel 5.2 için çalışan htaccess bulundu, şöyle:

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]

yasaklanması gereken başka bir dosya veya klasör olduğunda

RewriteRule ^your_file - [F,L,NC]

-1

Fazla bir şey yapmanız gerekmez, sadece kök dizinde bir .htaccess dosyası oluşturun ve aşağıdakileri yapıştırın / kaydedin;

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

Bu beni / kamu / kamuya yönlendiriyor
zanderwar

@zanderwar, lütfen Laravel versiyonu nedir? Ayrıca, umarım projenizi ana dizinden bir alt dizine sahip olmazsınız?
Victor Ifeanyi Ejiogu

Proje köküdür, sürüm 5.6'dır. * - Bir alt etki alanında olsa da, paylaşılan barındırmada; ne yazık ki bu cPanel kurulumu alt alan
adlarını
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.