Laravel URL'sinden "public / index.php" yi Nasıl Kaldırabilirim?


93

Laravel'de oluşturulan URL'yi kaldırmam index.phpveya kaldırmam gerekiyor public/index.php; yaygın yolu localhost/public/index.php/someWordForRoute, bu gibi bir şey olmalılocalhost/someWordForRoute.

.htaccess

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

RewriteEngine On

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

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

app / config / app.php

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

Bunu nasıl değiştirebilirim?


7
Laravel'de güzel URL'ler . mod_rewriteEtkin olduğundan emin olun .
Kryten


@Kryten çalışmıyor = /
TuGordoBello

2
Diğer çözüm işe yaramadığında
TuGordoBello

Belge /var/www/project_name/public
kökünüz

Yanıtlar:


131

1. Seçenek: .htaccess kullanın

Zaten orada yoksa, Laravel kök dizininde bir .htaccess dosyası oluşturun. .htaccessZaten yoksa Laravel kök dizininizde bir dosya oluşturun . (Normalde public_htmlklasörünüzün altındadır )

.Htaccess dosyasını aşağıdaki kodu içerecek şekilde düzenleyin:

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

Artık web sitesine "/public/index.php/" bölümü olmadan erişebilmelisiniz.

Seçenek 2: '/ public' dizinindeki şeyleri kök dizine taşıyın

Kök dizininizde yeni bir klasör oluşturun ve ortak klasör dışındaki tüm dosyaları ve klasörleri taşıyın. Ona ne istersen diyebilirsin. "Laravel_code" kullanacağım.

Ardından, her şeyi ortak dizinin dışına ve kök klasöre taşıyın. Şuna biraz benzer bir sonuç vermelidir: görüntü açıklamasını buraya girin

Bundan sonra, tek yapmamız gereken laravel_code/bootstrap/paths.phpdosya ve dosyadaki konumları düzenlemek index.php.

In laravel_code/bootstrap/paths.phpaşağıdaki kod satırı bulun:

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

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

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

İçinde index.phpşu satırları bulun:

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

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

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

Kaynak: Laravel'de URL'den / genel / URL'den nasıl kaldırılır


5
Eğer Debian Linux kullanıyorsanız, düzenleme unutmayın etc/apache2/apache2.confdeğişen AllowOverride Noneiçin AllowOverride All, dizin yapılandırma bakın nerede <Directory /var/www/></Directory>.
Robin Hood

1
Çalışması için kök dizinimde sadece .htaccess dosyasını bulundurmam gerekiyordu.
Mário Rodrigues

9
/ Root'a geçmek, üretim modunda hiç de iyi bir tavsiye değildir! Ortak klasörün var olmasının bir nedeni var
toesslab

Yeniden yazma kurallarının çalıştığından emin olmak için apache config <Directory ...yapılandırmasının AllowOverride All'<Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
şuna

Barındırma konusunda herhangi bir doğrulama erişimim yoksa ne olur?
Peter

40

Bunu Laravel 4.2'de denedim

Yeniden adlandırma server.phpiçin laravel kök klasöründe index.phpve kopyalama .htaccessdosyayı /publicsizin laravel kök klasörüne dizininde.

umarım işe yarar


1
Luazan'ın kabul ettiği cevap işe yaramazsa bu yeterli olacaktır. Yine de, doğrudan bu bağlantıya giderse, kullanıcıları genelden yeniden yönlendirmek için ortak klasördeki index.php dosyasını düzenlediğimden emin olurdum.
Brad Bird

4
JS

@MaHDyfo - neden güvenli değil? ve nasıl ?
151291

2
@ 151291 çünkü .env dosyası sitenizi bu şekilde ziyaret eden herkes tarafından erişilebilir. bundan kaçınmak için web sunucunuzun güvenliğini sağlamadığınız sürece.
Mahdyfo

17

Kullanmakta olduğum aşağıdaki pasajı diğer seçenekle karıştırmayın ve sizin için de yararlı olacaktır. Aşağıdaki htacces'i kökünüze koyun.

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

Genel dizininize gidin ve aşağıdaki kod parçacığı ile başka bir htaccess dosyası yerleştirin

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

</IfModule>

İşe yarıyor... !!!

Laravel .htaccess altında kullanır

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

Harika: bana bu yöntemin artılarını ve eksilerini söyleyebilir misin?
Muhammad Ateek

.Htaccess'i yalnızca root'ta (ilk snippet'iniz) düzenledim ve bu benim için düzeltti, teşekkürler!
2020

13

BURADA URL'DEKİ KAMUYU KALDIRMAK İÇİN BASİT ADIMLAR (Laravel 5)

1: Tüm dosyaları ortak klasörden kopyalayın ve bunları laravel kök klasörüne yapıştırın

2: index.php'yi açın ve değiştirin

Nereden

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

İçin

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

Ve

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

İçin

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

Laravel 4'te yol 2 $app = require_once __DIR__.'/bootstrap/start.php';yerine$app = require_once __DIR__.'/bootstrap/app.php';/app.php

İşte bu.


Siteden diğer bağlantılarla ilgili başka komplikasyonlar var mı?
Haring10

Bu harika bir çözüm gibi görünüyor ve aynı zamanda basit. Ama gerçekten, Haring10'un dediği gibi. Bununla ilgili herhangi bir sorun var mı?
Peter

12

1) mod_rewrite'ın etkin olup olmadığını kontrol edin. /etc/apache2/mods-enabledDizine gidin ve rewrite.loadmevcut olup olmadığına bakın . Değilse, komutunu kullanarak etkinleştirin. Yeniden sudo a2enmod rewriteyazma modülünü etkinleştirecektir. Zaten etkinleştirilmişse, mesajı gösterecektir Module rewrite already enabled.
2) Genel dizin için sanal bir ana bilgisayar oluşturun, böylece vermek yerine http://localhost/public/index.phpböyle kullanabilelim http://example.com/index.php. [bu nedenle genel klasör adı
gizlenecektir ] 3) Ardından, index.php'yi url'nizden, kök dizinin (ortak klasör) içinde gizleyecek bir .htaccess oluşturun.

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

1
Adımlarını denedim. Henüz sonuç yok! Bunun neden olduğunu bilmiyorum!
Mostafiz Rahman



benim için çalıştı. Sanal konağın doğrudan ortak klasöre gitmesini sağlamayın.
cardi777

Teşekkür ederim. Bu benim için çalıştı, benim mod_rewritedevre dışı bırakıldı.
Maubeh

5

Bunun Laravel ile çok az ilgisi vardır ve Apache yapılandırmalarınızla ilgili her şey vardır.

Apache sunucu yapılandırmanıza erişiminiz var mı? Öyleyse, bunu dokümanlardan kontrol edin:

Genel olarak, .htaccess dosyalarını yalnızca ana sunucu yapılandırma dosyasına erişiminiz olmadığında kullanmalısınız. Örneğin, kullanıcı kimlik doğrulamasının her zaman .htaccess dosyalarında yapılması gerektiğine dair yaygın bir yanlış kanı ve son yıllarda mod_rewrite yönergelerinin .htaccess dosyalarına girmesi gerektiğine dair başka bir yanlış kanı vardır. Bu sadece durum böyle değil. Kullanıcı kimlik doğrulama yapılandırmalarını ana sunucu yapılandırmasına koyabilirsiniz ve bu aslında işleri yapmanın tercih edilen yoludur. Aynı şekilde mod_rewrite yönergeleri de ana sunucu yapılandırmasında birçok açıdan daha iyi çalışır.

... Genel olarak, .htaccess dosyalarının kullanımından mümkün olduğunca kaçınılmalıdır. .Htaccess dosyası koymayı düşündüğünüz herhangi bir yapılandırma, ana sunucu yapılandırma dosyanızdaki bir bölümde de aynı şekilde etkili bir şekilde yapılabilir.

Kaynak: Apache belgeleri .

Bundan ilk bahsetmemin sebebi, .htaccessmümkünse tamamen kurtulmanın ve bir Directoryetiketin içinde bir VirtualHostetiket kullanmanın en iyisi olmasıdır . Bununla birlikte, bunun geri kalanı, .htaccessher ne sebeple olursa olsun rotaya bağlı kaldığınızı varsayacak .

Bunu yıkmak için birkaç şey olabilir:

  1. Belki de anlamsız bir şekilde dosyanızın adının .htacces sorunuzda . Tahminimce bu bir yazım hatası ama bir ihtimal göz ardı ettiniz ve aslında sadece saniyeyi kaçırıyor, bu tam olarak beni daha zorlu bir şey aramak için duvara vurmamı sağlayan küçük bir hata. .

  2. Sunucunuz izin veremez .htaccess . Bunu kontrol etmek için Apache yapılandırma dosyanıza gidin. Modern Apache derlemelerinde bu genellikle tek bir yapılandırma dosyasında değildir, bu nedenle nerede olursa olsun uygulamanıza işaret eden dosyayı kullandığınızdan emin olun. Değişiklik

    AllowOverride none
    

    -e

    AllowOverride all
    

    Bir takip olarak, Apache belgeleri, güvenlik amacıyla, gidecekseniz bunu her klasör için yapmamanızı tavsiye eder. .htaccess yeniden yazmaya . Bunun yerine, eklemeniz gereken klasörler .htaccessiçin yapın.

  3. Eğer var mı mod_rewriteetkin? Sorunların nedeni bu olabilir. Etiketin üstte olduğunu fark ettim <IfModule mod_rewrite.c>. Bu etiketleri yorumlamayı deneyin ve Apache'yi yeniden başlatın. Bir hata alırsanız bunun nedeni muhtemelen etkinleştirmeniz gerekmesidir mod_rewrite: Apache 2.2 için mod_rewrite nasıl etkinleştirilir?

Bu yardımcı olur umarım. En yaygın sorunlardan bazılarını adlandırdım, ancak daha sıradan veya benzersiz olabilecek birkaç sorun daha var. Dev sunucusunda başka bir öneri? Apache'yi yeniden yükleyin. Mümkünse, bunu iyi bir öğretici ile farklı bir kaynaktan yapın.


Apache2 yapılandırma ayarları için harika bir yakalayıcı, bu ayarı her zaman özlüyorum.
Abhishek

4

Laravel 4 ve 5 için:

  1. server.phpLaravel kök klasörünüzde şu şekilde yeniden adlandırın :index.php
  2. Kopya .htaccessdosyayı /publicsizin laravel dizinden kök klasörde .

Bu kadar !! :)



1

Laravel zaten güzel bir URL .htaccess ile geliyor ... kutudan çıkmanız iyi olur ... http://laravel.com/docs/installation#pretty-urls

Mod_rewrite'ın etkinleştirildiğinden ve ana yolunuzun uygulamanızın genel dizini olarak ayarlandığından emin olun.


Etkinleştirdim mod_rewriteve o sayfadaki kodu kopyaladım ve hala çalışmıyor
TuGordoBello

1
Apache'de yolunuzun uygulamanızın ortak klasörüne ayarlandığından emin olun.
Kisuka

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

Mod_rewrite'ı etkinleştirdikten sonra apache'yi yeniden başlattınız mı?
Kisuka

userFotoğrafları usermyproject.com/user
tuttuğum

1

Bunu yapmak için aşağıdaki adımları uygulamanız gerekir.

  • Alanınızı projenizin ortak klasörüne (yani / var / www / html / projeniz / genel) eşleyin (linux kullanıyorsanız)

  • Ortak klasörünüze gidin ve .htaccessorada dosyanızı düzenleyin

AddHandler application/x-httpd-php72 .php
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

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

    # Redirect non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

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

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


  • Son üç kural, olmadan herhangi bir rotaya doğrudan erişiyorsanız https, bunu korur.

0
 RewriteEngine on

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

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

bunu .htaccess içinde kullanın ve sunucuyu yeniden başlatın


0

Umarım bu benim için yaptığı gibi yardımcı olur.

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

0

Laravel 5'i bir proje için yeni kurdum ve root adında bir dosya var server.php.

Olarak değiştirin index.phpve çalışır veya terminalde yazın:

$cp server.php index.php

0

Yeniden adlandırma server.phpiçin laravel kök klasöründe index.phpve kopyalama .htaccessdosyayı /publicsizin laravel kök klasörüne dizininde.



0

IIS Windows Server kullanıyorsanız, web.configdosyayı kök klasöre ekleyin ve aşağıdaki kodu girin:

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

ve bunu kullanırsanız .htaccess :

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

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

3
Çözümünüz için biraz daha açıklama sağlayın
Naruto

-3

Laravel 5.3 uyarınca yukarıdaki şeyler düzgün çalışmayacaktır, ancak lütfen sakin olun ve aşağıdaki adımları izleyin:

Adım 1. Laravel projesinin içine gidin
Adım 2. Rasgele bir dizin / klasör oluşturun örn. laravelcode
Adım 3. Tüm klasör ve dosyaları taşıyın ( public klasör hariç )
Adım 4. public klasör içindeki tüm klasör ve dosyaları laravel projesine taşıyın
Adım 5. Şimdi laravel projesinin içinde index.php dosyası var, lütfen bunu açın ve önyükleme için klasör yollarını daha önce olduğu gibi yeni yola göre değiştirin " DIR gerektirir ." / .. / bootstrap / autoload.php '; " şimdi " DIR gerektirir ." / laravelcode / bootstrap / autoload.php '; "

Bu sadece url'nizi genel ve index.php olmadan çalıştırın, aşağıdaki gibi http: // localhost / blog /

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.