ISPConfig Vhost, разрешающий чистые URL-адреса в Laravel

У меня есть существующий сервер, который хорошо работает, на нем размещено несколько сайтов, использующих nginx и ISPconfig. Однако я создал новый сайт и хочу использовать Laravel.

Я успешно установил Laravel через композитор и дошел до того, что увидел знакомую приветственную колонку, отображаемую при посещении mywebsite.com/public.

Что я хочу сделать дальше, так это сделать несколько чистых URL-адресов. Мой опыт работы с файлами vhost несколько ограничен, и у меня возникли проблемы с конфигурацией.

Мой файл маршрутов выглядит так

Route::get('/', function () {
    return view('welcome');
});
Route::get('/test', function () {
    return view('test');
});

и я надеялся, что mywebsite.com/test отобразит содержимое test.blade.php

Я знаю, что мне нужно немного поработать с файлом vhost, прежде чем я смогу ожидать, что это сработает, но мой опыт работы с vhosts ограничен, и я немного растерялся.

Мой текущий файл выглядит так

server {
    listen *:80;
    server_name mywebsite.com ;

    root   /var/www/mywebsite.com/web;

    index index.html index.htm index.php index.cgi index.pl index.xhtml;

    error_page 400 /error/400.html;
    error_page 401 /error/401.html;
    error_page 403 /error/403.html;
    error_page 404 /error/404.html;
    error_page 405 /error/405.html;
    error_page 500 /error/500.html;
    error_page 502 /error/502.html;
    error_page 503 /error/503.html;
    recursive_error_pages on;
    location = /error/400.html {

        internal;
    }
    location = /error/401.html {

        internal;
    }
    location = /error/403.html {

        internal;
    }
    location = /error/404.html {

        internal;
    }
    location = /error/405.html {

        internal;
    }
    location = /error/500.html {

        internal;
    }
    location = /error/502.html {

        internal;
    }
    location = /error/503.html {

        internal;
    }

    error_log /var/log/ispconfig/httpd/mywebsite.com/error.log;
    access_log /var/log/ispconfig/httpd/mywebsite.com/access.log combined;

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location /stats/ {

        index index.html index.php;
        auth_basic "Members Only";
        auth_basic_user_file /var/www/clients/client1/web5/web/stats/.htpasswd_stats;
    }

    location ^~ /awstats-icon {
        alias /usr/share/awstats/icon;
    }

    location ~ \.php$ {
        try_files /5e26a1d85cb98f7191261e023385e60d.htm @php;
    }

    location @php {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/lib/php5-fpm/web5.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
    }
}

Теперь на другом сервере у меня это работает с этой простой директивой

server {
    root /var/www/public;
    index index.php index.html index.htm;
    server_name localhost;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
}

Но я ограничен тем, что я могу сделать с виртуальным хостом на текущем сервере, так как ISPconfig пишет большую часть этого для меня и отказывается писать приведенную выше конфигурацию, которая работала в другом месте. Также я чувствую, что редактирование файла напрямую будет плохой практикой, я всегда был бы на грани того, что ISPconfig перепишет файл для меня, поэтому я не совсем уверен, как лучше поступить с этим.

Мои варианты заключались бы в том, чтобы просто пойти дальше и отредактировать vhost и надеяться на лучшее, но если я это сделаю, как я могу гарантировать, что ISPconfig не сможет перезаписать файл, не прибегая к «хакерским» методам?

В качестве альтернативы, есть ли конфигурация, которую я могу ввести через ISPconfig, которая позволит перезаписывать правильно так, как это подходит Laravel? В этом случае любая введенная директива должна иметь приоритет над предложением ~ .php$, поскольку оно записывается ISPconfig перед любыми директивами, введенными через панель управления.


person Darren H    schedule 04.08.2015    source источник
comment
Я создал тег ispconfig (теперь это первый вопрос под тегом!), а также удалил тег nginx из этого вопроса, потому что как специалист по nginx я не понимаю, как я тут может помочь.   -  person cnst    schedule 10.08.2015


Ответы (3)


У меня недавно была такая же проблема. Копаясь в источниках ISPConfig, я понял, что он может вставлять/объединять/удалять блоки местоположения этого файла vhosts по умолчанию. Поэтому я сделал следующее:

Меню сайтов > выберите сайт > Параметры

Затем я ввел следующее в поле «Директивы nginx»:

# redirect stuff to the public inner folder
location / {
    root {DOCROOT}/public;
    try_files /public/$uri /public/$uri/ /public/index.php?$query_string;
} 

# merged the stuff people suggests for laravel inside the php block
# mind the 'merge' keyword that did the trick
location ~ \.php$ { ##merge##
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
}
person Danilo José    schedule 04.03.2016
comment
Интересно, я не знал об использовании ключевого слова ##merge##... также обратите внимание, что вместо явного указания директивы fastcgi_pass всегда лучше использовать вместо нее {FASTCGIPASS} (таким образом будет работать конфигурация с использованием сокетов TCP вместо сокетов UNIX). автоматически). Это работает для меня с несколькими сбоями — иногда Laravel будет добавлять .../index.php/... к URL-адресам, и nginx будет совершенно сбит с толку. И я также получаю несколько неработающих ссылок, которые явно происходят из-за неправильного анализа вещей. Но... вроде работает, намного лучше, чем то, что было у меня! - person Gwyneth Llewelyn; 09.01.2017

Есть небольшая проблема с ответом Данило. Php запустился, но ресурсы, такие как js/css/images, перестали загружаться. У меня работает добавление следующих директив nginx внутри ISPConfig:

location / {
    root {DOCROOT}/public;
    try_files $uri public/$uri/ /public/index.php?$query_string;
}
person Nitin...    schedule 21.03.2016

Я не эксперт в этом, но по моему прошлому опыту, если у меня есть два домена, я бы определил серверные блоки для каждого в двух разных файлах и поместил их в /etc/nginx/sites-available/site1.com и /etc/nginx/sites. -доступно/site2.com

но похоже, что у вас уже есть веб-сайт, доступ к которому осуществляется с помощью mywesite.com, расположенного по адресу /var/www/mywebsite.com/web; (см. корневое значение вашего файла конфигурации)

Теперь вы устанавливаете Laravel в тестовую папку в /var/www/mywebsite.com/test.

Чтобы получить доступ к этому, вам нужно попробовать добавить следующее в конец вашего файла ispconfig.

Обратите внимание, как я использовал относительный путь к общей папке laravel из корня блока сервера.

location /../test/public {
    try_files $uri $uri/ /index.php$is_args$args;
}

Для более подробного руководства попробуйте Настройка блока сервера Nginx.

Надеюсь это поможет,

K

person karmendra    schedule 14.08.2015
comment
Спасибо за усилия, это будет работать с типичной настройкой NGINX. Моя проблема заключается в том, что ISPConfig перезаписывает для меня большую часть файлов vhost, и я хочу избежать необходимости отнимать контроль у ISPConfig. - person Darren H; 14.08.2015
comment
О... Извините, я неправильно задал вопрос, к сожалению, у меня никогда не было возможности работать с панелью управления ispconfig. - person karmendra; 14.08.2015