{"id":5277,"date":"2026-04-12T12:59:58","date_gmt":"2026-04-12T03:59:58","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=5277"},"modified":"2026-04-12T22:31:49","modified_gmt":"2026-04-12T13:31:49","slug":"webserver-httplib-virtualhost-linux","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/04\/12\/webserver-httplib-virtualhost-linux\/","title":{"rendered":"[Webserver]httplib webserver+virtualhost(Linux)"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \uac00\uc0c1\ud638\uc2a4\ud2b8 \/ VirtualHost<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uac00\uc0c1\ud638\uc2a4\ud2b8\ub294 \ud558\ub098\uc758 \ubb3c\ub9ac\uc801\uc778 \uc11c\ubc84\uc5d0 \uc5ec\ub7ec\uac1c\uc758 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc6b4\uc601\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4.<br>A virtual host refers to running multiple websites on a single physical server.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \ubcf4\ud1b5 www.domain.com www2.domain.com\ub610\ub294 www.secdomain.org\ub4f1\uc73c\ub85c \ub3c4\uba54\uc778\uc774\ub098 \ud638\uc2a4\ud2b8 \uc774\ub984\uc73c\ub85c \uad6c\ubd84\ud569\ub2c8\ub2e4.<br>They are usually distinguished by domain or host names, such as www.domain.com, www2.domain.com, or www.secdomain.org.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uae30\ubcf8\uc801\uc73c\ub85c dns\uc11c\ubc84\uc5d0 \ud638\uc2a4\ud2b8,\ub3c4\uba54\uc778\uc5d0 \ub300\ud55c \ub808\ucf54\ub4dc \uc124\uc815\uc774 \ub418\uc5b4 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4.<br>Basically, records for the host and domain must be configured on the DNS server.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \ubc29\ud654\ubcbd \uc124\uc815 \ubd80\ubd84 \uc124\uba85\uc740 \uc774\uc804 \uac8c\uc2dc\ubb3c\uc744 \ucc38\uc870\ud558\uc138\uc694<br>Please refer to the previous post for the explanation of the firewall settings.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb httplib.h \ub2e4\uc6b4\ub85c\ub4dc \/ download<\/p>\n\n\n\n<p>\u2714\ufe0f httplib.h\ubc84\uc804\uc774 0.42.0\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<br>httplib.h version has been updated to 0.42.0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -L https:\/\/raw.githubusercontent.com\/yhirose\/cpp-httplib\/master\/httplib.h -o httplib.h<\/code><\/pre>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb https\uc124\uc815 \/ https settings<\/p>\n\n\n\n<p>\u2714\ufe0f https\uc778\uc99d\uc11c \uc7ac\ubc1c\uae09 \/ HTTPS certificate reissuance<\/p>\n\n\n\n<p>&#8212; \uae30\uc874\uc5d0 host1.freelifemakers.org\uc758 \uc778\uc99d\uc11c\ub97c \ubc1b\uc558\uc5b4\ub3c4 silverhand.freelifemakers.org\uc5d0 \ub300\ud55c \uc778\uc99d\uc11c\uac00 \uc5c6\ub2e4\uba74 \uc7ac\ubc1c\uae09 \ubc1b\uc544\uc57c\ud569\ub2c8\ub2e4.<br>Even if you have previously obtained a certificate for host1.freelifemakers.org, if you do not have a certificate for silverhand.freelifemakers.org, you must obtain a new one.<\/p>\n\n\n\n<p>&#8212; \ud558\ub098\uc758 \uc778\uc99d\uc11c\uc5d0 \ub3c4\ub9e4\uc778\uc744 \ub354 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>You can add more domains to a single certificate.<\/p>\n\n\n\n<p>&#8212; \uc778\uc99d\uc11c \uacbd\ub85c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.  \/  The certificate path is as follows.<br>\/etc\/letsencrypt\/live\/host1.domain.org\/fullchain.pem <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/http_lib_server_virtual$ <strong>sudo certbot certonly --standalone \\\n  -d host1.domain.org \\\n  -d silverhand.domain.org<\/strong>\nSaving debug log to \/var\/log\/letsencrypt\/letsencrypt.log\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nYou have an existing certificate that contains a portion of the domains you\nrequested (ref: \/etc\/letsencrypt\/renewal\/host1.domain.org.conf)\n\nIt contains these names: host1.domain.org\n\nYou requested these names for the new certificate:\nhost1.domain.org, silverhand.domain.org.\n\nDo you want to expand and replace this existing certificate with the new\ncertificate?\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n(E)xpand\/(C)ancel: e\nRenewing an existing certificate for host1.domain.org and silverhand.domain.org\n\nSuccessfully received certificate.\nCertificate is saved at: \/etc\/letsencrypt\/live\/host1.domain.org\/fullchain.pem\nKey is saved at:         \/etc\/letsencrypt\/live\/host1.domain.org\/privkey.pem\nThis certificate expires on 2028-10-10.\nThese files will be updated when the certificate renews.\nCertbot has set up a scheduled task to automatically renew this certificate in the background.\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nIf you like Certbot, please consider supporting our work by:\n * Donating to ISRG \/ Let's Encrypt:   https:\/\/letsencrypt.org\/donate\n * Donating to EFF:                    https:\/\/eff.org\/donate-le\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<\/code><\/pre>\n\n\n\n<p>&#8212; \uc778\uc99d\uc11c\ub97c \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc5d0 \ubcf5\uc0ac\ud569\ub2c8\ub2e4.<br>Copy the certificate to the current directory.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo cp \/etc\/letsencrypt\/live\/host1.domain.org\/fullchain.pem .\/\n$ sudo cp \/etc\/letsencrypt\/live\/host1.domain.org\/privkey.pem .\/\n# \ub0b4 \uacc4\uc815\uc73c\ub85c \uc18c\uc720\uad8c \ubcc0\uacbd \/ Change ownership to my account\n$ sudo chown username:username *.pem  <\/code><\/pre>\n\n\n\n<p>\ud83d\udc49\ud83c\udffbHttps \uc11c\ubc84(\ub9ac\ub205\uc2a4\uc5d0\uc11c \ud14c\uc2a4\ud2b8) \/ HTTPS server (tested on Linux)<\/p>\n\n\n\n<p>\u2714\ufe0f \uac00\uc0c1\ud638\uc2a4\ud2b8\ubcc4 \ub2e4\ub978 \uba54\uc138\uc9c0 \ubcf4\uc5ec\uc8fc\uae30<br>Show different messages per virtual host<\/p>\n\n\n\n<p>\u2714\ufe0f server.cpp \ucf54\ub4dc\/code<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define CPPHTTPLIB_OPENSSL_SUPPORT\n#include \"httplib.h\"\n#include &lt;iostream&gt;\n#include &lt;unordered_map&gt;\n\nint main() {\n    \/\/ https setting\n    httplib::SSLServer svr(\".\/fullchain.pem\", \".\/privkey.pem\");\n\n    if (!svr.is_valid()) {\n        std::cerr &lt;&lt; \"SSL server setup failed\\n\";\n        return 1;\n    }\n\n    \/\/ \uac00\uc0c1\ud638\uc2a4\ud2b8 \ub77c\uc6b0\ud305 \/ Virtual Host Routing\n    svr.set_pre_routing_handler(&#91;&amp;](const auto&amp; req, auto&amp; res) {\n\n        std::string host = req.get_header_value(\"Host\");  \/\/ Host \uae30\uc900\n        if (auto pos = host.find(':'); pos != std::string::npos) {\n            host = host.substr(0, pos);\n        }\n\n        if (host == \"host1.domain.org\") {\n            res.set_content(\"Hello VirtuslHost \ud83d\ude09\", \"text\/plain; charset=utf-8\"\");\n            return httplib::Server::HandlerResponse::Handled;\n        }\n        if (host == \"silverhand.domain.org\") {\n            res.set_content(\"Hello Silverhand \ud83d\udc4b\", \"text\/plain; charset=utf-8\"\");\n            return httplib::Server::HandlerResponse::Handled;\n        }\n        return httplib::Server::HandlerResponse::Unhandled;\n    });\n\n    \/\/ \uacf5\ud1b5 \ub77c\uc6b0\ud2b8 (\ud638\uc2a4\ud2b8 \ubabb \ub9de\ucd98 \uacbd\uc6b0) \/ Common route (if host does not match)\n    svr.Get(\"\/\", &#91;](const auto&amp; req, auto&amp; res) {\n        res.set_content(\"Default vhost\", \"text\/plain\");\n    });\n\n    std::cout &lt;&lt; \"Server Listening: https:\/\/0.0.0.0:5080\" &lt;&lt; std::endl;\n    svr.listen(\"0.0.0.0\", 5080);\n}\n<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ucef4\ud30c\uc77c \/ Compiling<\/p>\n\n\n\n<p>&#8212; \ucef4\ud30c\uc77c\uc2dc httplib.h (v0.42.0)\ubc84\uc804\uc758 \uc5c5\ub370\uc774\ud2b8\ub85c \uc778\ud574 c++17\ub85c \ucef4\ud30c\uc77c\ud574\uc57c \uacbd\uace0\ub098 \uc624\ub958\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<br>Due to the update of httplib.h (v0.42.0) during compilation, you must compile in C++17 to avoid warnings or errors.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>g++ -o server server.cpp -std=<strong>c++17<\/strong> -pthread -lssl -lcrypto<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uc2e4\ud589 \/ Run<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/server<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"435\" data-id=\"5289\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg-1024x435.jpg\" alt=\"\" class=\"wp-image-5289\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg-1024x435.jpg 1024w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg-300x128.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg-768x326.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg-400x170.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg-800x340.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-jpg.jpg 1054w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">host1<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"311\" data-id=\"5290\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg-1024x311.jpg\" alt=\"\" class=\"wp-image-5290\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg-1024x311.jpg 1024w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg-300x91.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg-768x233.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg-400x121.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg-800x243.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-jpg.jpg 1048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">host2<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u2714\ufe0f \ud638\uc2a4\ud2b8\ubcc4 \uc815\uc801\ud30c\uc77c \uc11c\ube59 \/ Serving static files per host<\/p>\n\n\n\n<p>\u2714\ufe0fserver_static.cpp \ucf54\ub4dc \/ code<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define CPPHTTPLIB_OPENSSL_SUPPORT\n#include \"httplib.h\"\n#include &lt;iostream&gt;\n#include &lt;fstream&gt;\n#include &lt;sstream&gt;\n#include &lt;unordered_map&gt;\n\nstatic std::string read_file(const std::string&amp; path) {\n    std::ifstream ifs(path, std::ios::binary);\n    if (!ifs) return {};\n    std::ostringstream ss;\n    ss &lt;&lt; ifs.rdbuf();\n    return ss.str();\n}\n\nstatic std::string sanitize_path(const std::string&amp; raw) {\n    if (raw.empty() || raw&#91;0] != '\/') return \"\/index.html\";\n    if (raw.find(\"..\") != std::string::npos) return \"\/index.html\";\n    if (raw.find('\\\\') != std::string::npos) return \"\/index.html\";\n    if (raw.back() == '\/') return raw + \"index.html\";\n    if (raw == \"\/\") return \"\/index.html\";\n    return raw;\n}\n\nstatic std::string mime_type(const std::string&amp; path) {\n    auto pos = path.find_last_of('.');\n    if (pos == std::string::npos) return \"application\/octet-stream\";\n    auto ext = path.substr(pos + 1);\n    if (ext == \"html\") return \"text\/html; charset=utf-8\";\n    if (ext == \"css\") return \"text\/css; charset=utf-8\";\n    if (ext == \"js\") return \"application\/javascript; charset=utf-8\";\n    if (ext == \"json\") return \"application\/json; charset=utf-8\";\n    if (ext == \"png\") return \"image\/png\";\n    if (ext == \"jpg\" || ext == \"jpeg\") return \"image\/jpeg\";\n    if (ext == \"svg\") return \"image\/svg+xml\";\n    if (ext == \"ico\") return \"image\/x-icon\";\n    if (ext == \"txt\") return \"text\/plain; charset=utf-8\";\n    return \"application\/octet-stream\";\n}\n\nint main() {\n    \/\/ \uc778\uc99d\uc11c \uacbd\ub85c \/ certificate path\n    httplib::SSLServer svr(\".\/fullchain.pem\", \".\/privkey.pem\");\n\n    if (!svr.is_valid()) {\n        std::cerr &lt;&lt; \"SSL server setup failed\\n\";\n        return 1;\n    }\n\n    \/\/ \ud638\uc2a4\ud2b8\ubcc4 \ub8e8\ud2b8 \ud3f4\ub354 \ub9e4\ud551 (\uc808\ub300\uacbd\ub85c \uad8c\uc7a5)\n    \/\/ Mapping root folders by host (absolute paths recommended)\n    std::unordered_map&lt;std::string, std::string&gt; roots = {\n        {\"host1.domain.org\", \"\/home\/username\/http_lib_server_virtual\/www\"},\n        {\"silverhand.domain.org\", \"\/home\/username\/http_lib_server_virtual\/www2\"}\n    };\n\n    svr.set_pre_routing_handler(&#91;&amp;](const auto&amp; req, auto&amp; res) {\n        std::string host = req.get_header_value(\"Host\");\n        if (auto pos = host.find(':'); pos != std::string::npos) {\n            host = host.substr(0, pos); \n        }\n\n        auto it = roots.find(host);\n        if (it == roots.end()) {\n            res.status = 404;\n            res.set_content(\"Unknown host\", \"text\/plain; charset=utf-8\");\n            return httplib::Server::HandlerResponse::Handled;\n        }\n\n        std::string rel = sanitize_path(req.path);\n        std::string full = it-&gt;second + rel;\n\n        auto body = read_file(full);\n        if (body.empty()) {\n            res.status = 404;\n            res.set_content(\"Not Found\", \"text\/plain; charset=utf-8\");\n        } else {\n            res.set_content(body, mime_type(full).c_str());\n        }\n        return httplib::Server::HandlerResponse::Handled;\n    });\n\n    std::cout &lt;&lt; \"Listening on https:\/\/0.0.0.0:5080\\n\";\n    svr.listen(\"0.0.0.0\", 5080);\n}\n<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ucef4\ud30c\uc77c \/ Compiling<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>g++ -o server_static server_static.cpp -std=<strong>c++17<\/strong> -pthread -lssl -lcrypto<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uc2e4\ud589 \/ Run<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/server_static<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1006\" height=\"318\" data-id=\"5301\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-static-jpg.jpg\" alt=\"\" class=\"wp-image-5301\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-static-jpg.jpg 1006w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-static-jpg-300x95.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-static-jpg-768x243.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-static-jpg-400x126.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/host1-static-jpg-800x253.jpg 800w\" sizes=\"auto, (max-width: 1006px) 100vw, 1006px\" \/><figcaption class=\"wp-element-caption\">host1<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"996\" height=\"380\" data-id=\"5302\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-static-jpg.jpg\" alt=\"\" class=\"wp-image-5302\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-static-jpg.jpg 996w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-static-jpg-300x114.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-static-jpg-768x293.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-static-jpg-400x153.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/silverhand-static-jpg-800x305.jpg 800w\" sizes=\"auto, (max-width: 996px) 100vw, 996px\" \/><figcaption class=\"wp-element-caption\">host2<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb \uac00\uc0c1\ud638\uc2a4\ud2b8 \/ VirtualHost \ud83d\udc49\ud83c\udffb \uac00\uc0c1\ud638\uc2a4\ud2b8\ub294 \ud558\ub098\uc758 \ubb3c\ub9ac\uc801\uc778 \uc11c\ubc84\uc5d0 \uc5ec\ub7ec\uac1c\uc758 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc6b4\uc601\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4.A virtual host refers to running multiple websites on a single physical server. \ud83d\udc49\ud83c\udffb \ubcf4\ud1b5 www.domain.com www2.domain.com\ub610\ub294 www.secdomain.org\ub4f1\uc73c\ub85c \ub3c4\uba54\uc778\uc774\ub098 \ud638\uc2a4\ud2b8 \uc774\ub984\uc73c\ub85c \uad6c\ubd84\ud569\ub2c8\ub2e4.They are usually distinguished by domain or host names, such as www.domain.com, www2.domain.com, or www.secdomain.org. \ud83d\udc49\ud83c\udffb \uae30\ubcf8\uc801\uc73c\ub85c dns\uc11c\ubc84\uc5d0 \ud638\uc2a4\ud2b8,\ub3c4\uba54\uc778\uc5d0 \ub300\ud55c \ub808\ucf54\ub4dc [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,1],"tags":[],"class_list":["post-5277","post","type-post","status-publish","format-standard","hentry","category-cpp","category-uncategorized","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/5277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=5277"}],"version-history":[{"count":25,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/5277\/revisions"}],"predecessor-version":[{"id":5307,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/5277\/revisions\/5307"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=5277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=5277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=5277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}