2016-02-08 4 views
1

Я пробовал простой пример с CppCms, и я хотел бы выполнить все мои приложения относительно корня веб-приложения. Я не хочу выполнять приложение относительно пути к скрипту. Ex localhost: 8080/script-path/relative-path-to-my-application, и вместо этого я хотел бы, чтобы путь для моего приложения был таким: localhost: 8080/relative-path-to-my-application. Я хотел бы выполнить это приложение с помощью CppCMS-Embedded. Я пробую очень простой пример, и я не имел успеха. Я все время пытаюсь корневой URL (http://localhost:8080/) Я получаю ошибку 404 так:CppCMS-Embedded 404

Connection   close 
Content-Encoding gzip 
Content-Type  text/html; charset=utf-8 
Server    CppCMS-Embedded/1.1.0 
X-Powered-By  CppCMS/1.1.0 
status    404 Not Found 
Accept    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding  gzip, deflate 
Accept-Language  en-US,en;q=0.5 
Cache-Control  max-age=0 
Connection   keep-alive 
Cookie    _ga=GA1.1.541474771.1454701631 
Host    localhost:8080 
User-Agent   Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0 

Ниже кода и конфигурационных файлов, которые я сделал:

main.cpp:

#include <cppcms/application.h> 
#include <cppcms/applications_pool.h> 
#include <cppcms/service.h> 
#include <cppcms/http_response.h> 
#include <cppcms/url_dispatcher.h> 
#include <cppcms/url_mapper.h> 
#include <iostream> 
#include "content.h" 
    class my_app : public cppcms::application{ 
     public: 
     my_app(cppcms::service& s) : cppcms::application(s){ 
       dispatcher().assign("",&my_app::well_come,this); 
       mapper().assign(""); 
       mapper().root(""); 
    } 
    void well_come(){ 
     content::index ci; 
     ci.message = "Hello "; 
     render("index",ci); 
    } 

    }; 
    int main(int argc,char ** argv){ 
    try{ 
     cppcms::service srv(argc,argv); 
     srv.applications_pool().mount(
      cppcms::applications_factory<my_app>() 
     ); 
     srv.run(); 
    }catch(std::exception const & e){ 
     std::cerr<<e.what()<<std::endl; 
    } 
} 

config.js:

{ 
    "http" : { 
     "script" : "/mb.fcgi", 
     "rewrite" : [ 
      { "regex" : "/media(/.*)?", "pattern" : "$0" }, 
      { "regex" : ".*" , "pattern" : "/mb.fcgi$0" } 
     ] 
    }, 
    "service": { 
     "api":"http", 
     "port":8080 
    }, 
    "views" : { 
     "paths" : [ "./" ], 
     "skins" : [ "my_app"], 
    }, 
} 

index.tmpl

<% c++ #include "content.h" %> 
<% skin my_app %> 
<% view index uses content::index %> 
<% template render()%> 
    <html> 
    <body> 
     <h1><%= message %> World!</h1> 
    </body> 
    </html> 
<% end template %> 
<% end view %> 
<% end skin %> 

content.h

#include <cppcms/view.h> 
namespace content{ 
    struct index : public cppcms::base_content{ 
    std::string message; 
    }; 
} 

Что мне хватает в моей конфигурации? Почему CppCMS-Embedded не выполняет маршрутизацию для корня веб-приложения. Спасибо.

ответ

1

После некоторых потоков в сообществе CppCms, Артем Бейлис открыл мой разум для этой проблемы. Все время, когда я запрашивал корневой URL-адрес http://domain.com/, я получил ошибку 404 из-за того, что CppCms всегда ожидает по крайней мере некоторого сопоставления, которое не является пустым, например «/» или любая другая строка, начинающаяся с «/». Правильный способ - всегда сопоставлять то, что начинается с «/». Хорошим решением, предложенным Artyom Beilis, является сохранение перезаписи url в той же форме, что и учебник: How to run the application at the root of the web server. И добавить отображение, которое не пусто, что соответствует с URL по умолчанию, как это:

dispatcher().assign("/",&my_app::well_come,this); 
mapper().assign("well_come","/"); 

Это решение работает очень хорошо для меня =;)

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