Làm cách nào tôi có thể xóa “public / index.php” trong URL được tạo Laravel?


90

Tôi cần xóa index.phphoặc public/index.phpkhỏi URL đã tạo trong Laravel; con đường thông thường là localhost/public/index.php/someWordForRoute, Nó phải giống như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',

Làm thế nào tôi có thể thay đổi điều đó?


7
Các URL đẹp trong Laravel . Đảm bảo đã mod_rewriteđược bật.
Kryten


@Kryten không hoạt động = /
TuGordoBello

2
Đây là giải pháp khi công việc giải pháp doen't khác dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello

Là gốc trỏ tài liệu tại thư mục dự, tức/var/www/project_name/public
Kiee

Câu trả lời:


129

Tùy chọn 1: Sử dụng .htaccess

Nếu nó chưa có ở đó, hãy tạo tệp .htaccess trong thư mục gốc của Laravel. Tạo một .htaccesstệp trong thư mục gốc Laravel của bạn nếu nó chưa tồn tại. (Thông thường nó nằm trong public_htmlthư mục của bạn )

Chỉnh sửa tệp .htaccess để nó chứa mã sau:

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

Bây giờ bạn sẽ có thể truy cập trang web mà không có phần "/public/index.php/".

Tùy chọn 2: Di chuyển những thứ trong thư mục '/ public' vào thư mục gốc

Tạo một thư mục mới trong thư mục gốc của bạn và di chuyển tất cả các tệp và thư mục ngoại trừ thư mục chung. Bạn có thể gọi nó là bất cứ thứ gì bạn muốn. Tôi sẽ sử dụng "laravel_code".

Tiếp theo, di chuyển mọi thứ ra khỏi thư mục chung và vào thư mục gốc. Nó sẽ dẫn đến một cái gì đó tương tự như sau: nhập mô tả hình ảnh ở đây

Sau đó, tất cả những gì chúng ta phải làm là chỉnh sửa các vị trí trong laravel_code/bootstrap/paths.phptệp và index.phptệp.

Trong laravel_code/bootstrap/paths.phptìm dòng mã sau đây:

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

Và thay đổi chúng thành:

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

Trong index.php, hãy tìm những dòng sau:

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

Và thay đổi chúng thành:

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

Nguồn: Cách xóa / public / khỏi URL trong Laravel


5
Nếu bạn sử dụng Debian Linux, đừng quên chỉnh sửa etc/apache2/apache2.confthay đổi từ AllowOverride Noneđến AllowOverride Allnơi bạn nhìn thấy cấu hình Directory, <Directory /var/www/></Directory>.
Robin Hood

1
Tôi chỉ cần có tệp .htaccess vào thư mục gốc của tôi để nó hoạt động.
Mário Rodrigues

8
Di chuyển đến / root không phải là một lời khuyên tốt trong chế độ sản xuất! Có một lý do tại sao thư mục công cộng tồn tại
toesslab

Để đảm bảo các quy tắc viết lại hoạt động, hãy kiểm tra xem cấu hình cấu hình apache <Directory ...AllowOverride All'Giống như thế này không: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva

Điều gì xảy ra nếu tôi không có quyền truy cập conf trên hosting?
Peter

40

Tôi đã thử điều này trên Laravel 4.2

Đổi tên server.phptrong thư mục gốc Laravel của bạn thành index.phpvà sao chép .htaccesstệp từ /publicthư mục vào thư mục gốc Laravel của bạn.

Tôi hy vọng nó hoạt động


1
Nếu câu trả lời được chấp nhận bởi Luazan không hoạt động thì điều này là đủ. Mặc dù tôi sẽ đảm bảo chỉnh sửa tệp index.php trong thư mục chung để chuyển hướng người dùng ra khỏi chế độ công khai nếu họ truy cập thẳng vào liên kết đó.
Brad Bird

4
Js và css file không được nạp nữa từ thư mục công cộng
llioor

@MaHDyfo - tại sao nó không an toàn? và làm thế nào ?
151291

2
@ 151291 vì tệp .env có thể truy cập được cho mọi người truy cập trang web của bạn theo cách này. trừ khi bạn bảo mật máy chủ web của mình để tránh điều này.
Mahdyfo

17

Đừng nhầm lẫn với tùy chọn khác, đoạn mã dưới đây tôi đang sử dụng và cũng sẽ hữu ích cho bạn. Đặt htacces dưới đây vào thư mục gốc của bạn.

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

Đi tới thư mục công cộng của bạn và đặt một tệp htaccess khác với đoạn mã bên dưới

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

Nó đang hoạt động ... !!!

Laravel Sử dụng bên dưới .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]

Tuyệt vời: bạn có thể cho tôi biết ưu và nhược điểm của phương pháp này là gì không?
Muhammad Ateek

Tôi chỉ chỉnh sửa .htaccess trong root (đoạn mã đầu tiên của bạn) và điều đó đã sửa nó cho tôi, cảm ơn!
kỳ lạ

13

ĐÂY LÀ CÁC BƯỚC ĐƠN GIẢN ĐỂ LOẠI BỎ CÔNG KHAI TRONG URL (Laravel 5)

1: Sao chép tất cả các tệp trong thư mục công cộng và dán chúng vào thư mục gốc laravel

2: Mở index.php và thay đổi

Từ

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

Đến

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

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

Đến

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

Trong laravel 4, đường dẫn 2 là $app = require_once __DIR__.'/bootstrap/start.php';thay vì$app = require_once __DIR__.'/bootstrap/app.php';/app.php

Đó là nó.


Có bất kỳ biến chứng nào khác liên quan đến các liên kết khác từ trang web không?
Haring

Đó trông giống như một giải pháp tuyệt vời và cũng đơn giản. Nhưng thực sự, như Haring10 đã nói. Có bất kỳ vấn đề với điều này?
Peter

10

1) Kiểm tra xem mod_rewrite đã được bật chưa. Vào /etc/apache2/mods-enabledthư mục và xem liệu rewrite.loadcó sẵn không. Nếu không, hãy kích hoạt nó bằng lệnh sudo a2enmod rewrite. Nó sẽ kích hoạt mô-đun viết lại. Nếu nó đã được bật, nó sẽ hiển thị thông báo Module rewrite already enabled.
2) Tạo một máy chủ ảo cho thư mục công cộng để thay vì cung cấp cho http://localhost/public/index.phpchúng tôi sẽ có thể sử dụng như vậy http://example.com/index.php. [do đó tên thư mục công khai sẽ bị ẩn]
3) Sau đó, tạo một .htaccess sẽ ẩn index.php khỏi url của bạn. Tên này sẽ nằm bên trong thư mục gốc (thư mục chung)

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

1
Đã thử các bước của bạn. Chưa có kết quả! Tôi không hiểu tại sao điều này lại xảy ra!
Mostafiz Rahman

Đưa các thông tin đăng nhập để chúng ta có thể theo dõi các nguyên nhân gốc rễ
Orchid

Đây là tệp nhật ký đầy đủ: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Mostafiz Rahman

đã làm cho tôi. Không làm cho máy chủ ảo chuyển thẳng đến thư mục chung.
cardi777

Cảm ơn bạn. Điều này làm việc cho tôi, tôi mod_rewriteđã bị vô hiệu hóa.
Maubeh 20/02/16

5

Điều này có thể liên quan rất ít đến Laravel và mọi thứ liên quan đến cấu hình Apache của bạn.

Bạn có quyền truy cập vào cấu hình máy chủ Apache của mình không? Nếu vậy, hãy kiểm tra điều này, từ tài liệu:

Nói chung, bạn chỉ nên sử dụng tệp .htaccess khi bạn không có quyền truy cập vào tệp cấu hình máy chủ chính. Ví dụ, có một quan niệm sai lầm phổ biến rằng xác thực người dùng luôn phải được thực hiện trong các tệp .htaccess và trong những năm gần đây, một quan niệm sai lầm khác cho rằng chỉ thị mod_rewrite phải đi kèm trong tệp .htaccess. Điều này chỉ đơn giản là không phải vậy. Bạn có thể đặt cấu hình xác thực người dùng trong cấu hình máy chủ chính và trên thực tế, đây là cách ưu tiên để thực hiện. Tương tự như vậy, các chỉ thị mod_rewrite hoạt động tốt hơn, theo nhiều khía cạnh, trong cấu hình máy chủ chính.

... Nói chung, nên tránh sử dụng tệp .htaccess khi có thể. Bất kỳ cấu hình nào bạn muốn đưa vào tệp .htaccess cũng có thể được thực hiện một cách hiệu quả trong một phần trong tệp cấu hình máy chủ chính của bạn.

Nguồn: Tài liệu Apache .

Lý do tại sao tôi đề cập đến điều này đầu tiên là vì tốt nhất bạn nên loại bỏ .htaccesshoàn toàn nếu có thể và sử dụng một Directorythẻ bên trong VirtualHostthẻ. Điều đó đang được nói, phần còn lại của điều này sẽ giả sử bạn đang gắn bó với.htaccess lộ trình vì bất kỳ lý do gì.

Để phá vỡ điều này, một vài điều có thể xảy ra:

  1. Tôi lưu ý, có lẽ vô nghĩa, tệp của bạn được đặt tên .htacces trong câu hỏi của bạn. Tôi đoán rằng đó là lỗi đánh máy nhưng rất có thể bạn đã bỏ qua nó và thực tế là nó chỉ thiếu chữ thứ hai, đây chính xác là một loại lỗi nhỏ khiến tôi đập đầu vào tường để tìm kiếm thứ gì đó khó khăn hơn .

  2. Máy chủ của bạn không thể cho phép .htaccess. Để kiểm tra điều này, hãy truy cập tệp cấu hình Apache của bạn. Trong các bản dựng Apache hiện đại, tệp này thường không nằm trong một tệp cấu hình, vì vậy hãy đảm bảo rằng bạn đang sử dụng tệp trỏ đến ứng dụng của mình, dù nó tồn tại ở đâu. Thay đổi

    AllowOverride none
    

    đến

    AllowOverride all
    

    Tiếp theo, các tài liệu Apache cũng khuyến cáo rằng, vì mục đích bảo mật, bạn không thực hiện việc này cho mọi thư mục nếu bạn định .htaccessviết lại. Thay vào đó, hãy làm điều đó cho các thư mục bạn cần thêm .htaccessvào.

  3. Bạn đã mod_rewritekích hoạt chưa? Điều đó có thể gây ra vấn đề. Tôi nhận thấy bạn có thẻ ở trên cùng <IfModule mod_rewrite.c>. Hãy thử nhận xét các thẻ đó và khởi động lại Apache. Nếu bạn gặp lỗi thì có thể là do bạn cần bật mod_rewrite: Cách bật mod_rewrite cho Apache 2.2

Hi vọng điêu nay co ich. Tôi đã nêu tên một số vấn đề phổ biến nhất nhưng có một số vấn đề khác có thể trần tục hơn hoặc độc đáo hơn. Một gợi ý khác về máy chủ nhà phát triển? Cài đặt lại Apache. Nếu có thể, hãy làm như vậy từ một nguồn khác có hướng dẫn tốt.


Rất tốt cho cài đặt cấu hình apache2, tôi luôn nhớ cài đặt này.
Abhishek

4

Đối với Laravel 4 & 5:

  1. Đổi tên server.phptrong thư mục gốc Laravel của bạn thànhindex.php
  2. Sao chép .htaccesstệp từ /publicthư mục vào thư mục gốc Laravel của bạn .

Đó là nó !! :)


2

Đồng thời đảm bảo rằng Rewrite Engline được bật sau khi chỉnh sửa tệp .htaccess

sudo a2enmod rewrite

Quan sát tốt, tôi đang ở trên một máy chủ mới và thực sự phải kích hoạt nó (và thêm các bit cần thiết trong cấu hình apache) bằng cách sử dụng digitalocean.com/community/tutorials/…
cdsaenz

1

Laravel có sẵn một URL .htaccess khá đẹp ... bạn nên sẵn sàng sử dụng ... http://laravel.com/docs/installation#pretty-urls

Đảm bảo rằng mod_rewrite được bật và đường dẫn trang chủ của bạn được đặt thành thư mục công khai của ứng dụng của bạn.


Tôi đã kích hoạt mod_rewritevà tôi đã sao chép mã trên trang đó và vẫn không hoạt động
TuGordoBello

1
Đảm bảo trong Apache đường dẫn của bạn được đặt thành thư mục chung của ứng dụng.
Kisuka

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

Bạn có khởi động lại apache sau khi bật mod_rewrite không?
Kisuka

Tôi có một thư mục được gọi userlà nơi tôi lưu giữ các bức ảnh, tôi cũng có một tệp phiến có tên là user, khi tôi viết vào URL myproject.com/usersẽ hiển thị cho tôi nội dung của thư mục, các bức ảnh
TuGordoBello

1

Bạn phải thực hiện các bước sau để làm điều này, như sau

  • Ánh xạ miền của bạn lên đến thư mục công khai trong dự án của bạn (tức là / var / www / html / yourproject / public) (nếu sử dụng linux)

  • Đi tới thư mục công cộng của bạn, chỉnh sửa .htaccesstệp của bạn ở đó

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>


  • Ba quy tắc cuối cùng là nếu bạn đang truy cập trực tiếp vào bất kỳ tuyến đường nào mà không có https, nó bảo vệ điều đó.

0
 RewriteEngine on

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

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

sử dụng điều này trong .htaccess và khởi động lại máy chủ


0

Hy vọng điều này sẽ giúp giống như nó đã làm cho tôi.

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

0

Tôi vừa cài đặt Laravel 5 cho một dự án và có một tệp trong gốc được gọi server.php.

Thay đổi nó thành index.phpvà nó hoạt động hoặc nhập vào thiết bị đầu cuối:

$cp server.php index.php

0

Đổi tên server.phptrong thư mục gốc Laravel của bạn thành index.phpvà sao chép .htaccesstệp từ /publicthư mục vào thư mục gốc Laravel của bạn.



0

Nếu bạn sử dụng IIS Windows Server, hãy thêm web.configtệp vào thư mục gốc và đặt mã dưới đây:

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

và nếu bạn sử dụng, hãy sử .htaccess dụng cái này:

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
Cung cấp thêm lời giải thích cho giải pháp của bạn
Naruto

-3

Theo Laravel 5.3 , những thứ trên sẽ không hoạt động bình thường, nhưng hãy bình tĩnh và làm theo các bước sau:

Bước 1. Vào bên trong dự án laravel
Bước 2. Tạo một thư mục / thư mục ngẫu nhiên, ví dụ. laravelcode
Bước 3. Di chuyển tất cả các thư mục và các tập tin (Trừ công thư mục)
Bước 4. Di chuyển tất cả các thư mục và các tập tin mà là bên trong công thư mục vào dự án laravel
Bước 5. Bây giờ bên trong dự án laravel có file index.php, xin vui lòng mở và thay đổi đường dẫn thư mục cho bootstrap theo đường dẫn mới như trước đây là " request DIR . '/ .. / bootstrap / autoload.php';" bây giờ nó sẽ trở thành "yêu cầu DIR request . '/ laravelcode / bootstrap / autoload.php';"

Đó là nó chỉ chạy url của bạn mà không có public và index.php như bên dưới http: // localhost / blog /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.