2015-02-13 3 views
6

Я пытаюсь настроить несколько webapp на моем веб-сервере nginx, но я не могу получить одно приложение Laravel, которое требует, чтобы $ document_root устанавливался в общую папку laravel. В настоящее время я пытаюсь настроить его с помощью директивы alias, но по неясной причине это не работает. Вот что я пытаюсь сделать.Как правильно настроить директиву alias в nginx?

# Default server configuration 
# 
server { 
    listen 80; 

    # SSL configuration 
    # 
    listen 443 ssl; 

    error_log /var/log/nginx/error.log warn; 

    ssl_certificate /etc/nginx/ssl/server.crt; 
    ssl_certificate_key /etc/nginx/ssl/server.key; 


    set $root_path '/var/www/html'; 
    root $root_path; 

    # Add index.php to the list if you are using PHP 
    index index.html index.htm index.nginx-debian.html index.php; 

    server_name localhost; 

    location /paperwork { 
     alias /var/www/html/paperwork/frontend/public; 
     try_files $uri $uri/; 
     #location ~ \.php { 
     # fastcgi_split_path_info ^(.+\.php)(.*)$; 
     # fastcgi_pass unix:/var/run/php5-fpm.sock; 
     # include /etc/nginx/fastcgi_params; 
     # #fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 
     # #fastcgi_intercept_errors on; 
     #} 
    } 

    #location @paperwork { 
    # rewrite /paperwork/(.*)$ /paperwork/index.php/$1 last; 
    #} 

    location/{ 

    } 


    location /wallabag { 
     try_files $uri $uri/ /index.php; 
    } 

    location /laverna { 
     try_files $uri/ /index.php; 
    } 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    # 
    location ~ \.php$ { 
     # With php5-cgi alone: 
     #fastcgi_pass 127.0.0.1:9000; 
     # With php5-fpm: 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     #try_files $uri $uri/ =404; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 



    # deny access to .htaccess files, if Apache's document root 
    # concurs with nginx's one 

    location ~ /\.ht { 
     deny all; 
    } 
} 

Чтобы проверить мой «псевдоним» конфиг я положить файлы «test.php» в /var/www/html/paperwork/frontend/public/test.php и попытался получить к нему доступ через https://IP/paperwork/test.php. Я получаю ошибку 404 и ничего в журнале ошибок nginx. Если я попробую https://IP/paperwork/frontend/public/test.php в браузере, он отобразит файл test.php без ошибок. Ничего не меняется, если я раскомментирую строку try_files в местоположении php.

Если я копирую test.php в /var/www/html/paperwork/test2.php и получает доступ к https://IP/paperwork/test2.php, файл отображается без ошибок, поэтому я могу видеть здесь, что псевдоним не работает, поскольку нет test2. php в общедоступном каталоге документации.

У меня может быть другое поведение, если я раскомментирую расположение php внутри места работы с документами. При этом запросы, такие как https://IP/paperwork/test.php, не отображают 404, а пустой экран.

Я через многих форумов/вопросы, связанные с этим, но я не мог получить рабочий конфиг для простой задачи, как отображение test.php ...

Спасибо!

ответ

19

Я нашел решение. Похоже, что неправильный запрос был отправлен для php-файлов. Когда используется псевдоним, рекомендуется использовать $ request_filename вместо $ fastcgi_script_name.

Вот мое расположение блока:

location /paperwork { 

     alias /var/www/html/paperwork/frontend/public; 
     #try_files $uri $uri/; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
      #fastcgi_intercept_errors on; 
     } 
} 

Это решило мою проблему для моего файла «test.php», который теперь выполнен при достижении https://IP/paperwork/test.php. Таким образом, псевдоним работает, и php хорошо выполняется. У меня все еще есть проблема при попытке достичь индекса index.php (это мой индекс приложения laravel). Файл найден, но вместо его загрузки он загружается. Поэтому, когда я достигаю https://IP/paperwork/index.php, я получаю загруженный файл входа, который является файлом index.php. Я получаю такое же поведение, если я попробую /paperwork/index.php/login или/paperwork/login.

+2

Это меня колотило месяцами, спасибо. – demure

+1

Да! Спасибо. Ключ использовал '$ request_filename'. У каждого другого примера был 'fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name', но это не сработало. – heisian

Смежные вопросы