it-swarm.com.ru

Как оформить и настроить .htaccess для Laravel?

Я только что запустил проект Laravel 5.3 на работающем сервере, и все идет хорошо, кроме одного.

Но моя проблема в том, что мои сайты работают по всем 3 различным URL.

Мой сервер Ubuntu 16.4.

  1. website.com

  2. website.com/public/index.php

  3. website.com/ any Word /index.php

Мой .htaccess: (Этот файл находится в корневой папке)

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

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

Но я просто хочу видеть мой сайт только с website.com URL. 

7
mySun

Похоже, ваше приложение Laravel доступно через HTTP-псевдоним Apache. Следуй этим шагам

Попробуйте перейти к ожидаемому маршруту, добавив /index.php/, в вашем случае: website.com/index.php/users. Если это работает (нет 404), то у вас проблема с конфигурацией модуля перезаписи Apache HTTP, вы должны выполнить следующие шаги.

Отредактируйте файл public/.htaccess.

Под строкой RewriteEngine On добавьте RewriteBase /, если файлы находятся в корневом каталоге, если в папке, подобной laravel, добавьте RewriteBase /laravel/

Попробуйте перейти к существующему маршруту.

т.е. 

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

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

Удалить/public из вашего Laravel Создать виртуальный хост 

перейдите в /etc/Apache2/sites-available, создайте файл .conf или обновите 000-default.conf 

<VirtualHost *:80>
   ServerAdmin [email protected]
   ServerName website.com
  ServerAlias www.website.com

DocumentRoot /var/www/html/index.html

        <Directory /var/www/html/>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>


        ErrorLog ${Apache_LOG_DIR}/error.log
        CustomLog ${Apache_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =website.com [OR]
RewriteCond %{SERVER_NAME} =www.website.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>
2
M Arfan

Этот код работал для меня. Это удалит расширение с вашего сайта, например .php и все. Попробуйте это один раз.

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]
1
Siddhesh

Чтобы соответствовать только домашней странице, т. Е. http://domainxyz.com/, вам нужно соответствовать пустому пути (так как mod_Rewrite удаляет ведущий /.

RewriteCond %{HTTP_Host} ^www.domainxyz.com [NC]
RewriteRule ^$ /view.php?page=process/ [NC,L]
1
lax1089

Попробуйте использовать это в своем файле .htaccess:

RewriteEngine on
RewriteCond %{HTTP_Host} ^website.com/([a-zA-Z-]*)/index.php [NC,OR]
RewriteCond %{HTTP_Host} ^www.website.com/([a-zA-Z-]*)/index.php [NC]
RewriteRule ^(.*)$ http://www.website.com [L,R=302,NC]

Убедитесь, что вы очистили свой кэш перед тестированием. Вы заметите, что я использовал R=302, это временное перенаправление. Если перенаправление работает, и вы довольны им, переключите это на R=301, который является постоянным перенаправлением.

1
Joe

1. Я понимаю, почему вы пытаетесь изменить .htaccess, но это можно решить намного проще. Верните файл .htaccess обратно к стандарту Laravel

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

    RewriteEngine On

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

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

2. Переместите все свои папки и файлы отдельно от общедоступных и убедитесь, что они находятся за вашей папкой HTML.

3. Переместите все ваши общие папки и файлы из общей папки в вашу html-папку

4. Скажите laravel искать в вашей папке html вместо public, изменив файл server.php

<?php

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <[email protected]>
 */

$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/html'.$uri)) {
    return false;
}

require_once __DIR__.'/html/index.php';

Я считаю, что это решение намного проще, чем возиться с вами htaccess. Вы также гарантируете, что все основные файлы Laravel не будут доступны из URL.

Другая проблема, с которой вы столкнулись (внутренние страницы)

Вероятно, это связано с тем, что ваш Apache не позволяет переопределить с помощью Laravels htaccess

Перейдите в командную строку вашего сервера и получите доступ к файлу Apache2.conf

cd /etc/Apache2

Откройте файл Apache2.conf с помощью nano

Sudo nano Apache2.conf

Теперь найдите следующее

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

Измените это на

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

Записать изменения и выйти из нано.

Перезапустите Apache

Sudo service Apache2 restart

Теперь должно работать :)

1
Chris Townsend