网页大意:
如何根据URL访问(带或不带子域)将用户重定向到相应的页面
事实上,有一个来自npm的名为express-subdomain-handler
的包帮助服务器端的域和子域路由,我没有问题地做到这一点并部署到Heroku。
app.use(subdomainHandler({
baseUrl: 'localhost',
prefix: 'subdomain',
logger: true
}));
app.get('/', function (request, response) {
response.send('WELCOME TO LOCALHOST');
});
app.get('/subdomain/:shop', function (request, response) {
response.send('WELCOME TO SUBDOMAIN');
});
我相信上面的路由更倾向于服务器端呈现,因为它只根据访问的URL(或endpoint)呈现相应的页面。但用这种方式渲染React app有可能吗?因为我以前所做的只是基本上呈现.ejs
页面,这就是为什么我不确定这一点,而且我以前从未使用过react.js。
其次,如果我将React app托管在另一台服务器上,也许是Vercel或NGINX或任何东西,并使用REST API访问heroku中的后端服务,这是部署网站的正确方法吗?如果是这样,那么域和子域路由是在React应用程序的托管站点上完成的,还是在代码本身内部完成的,而不是在Heroku中的expressjs?我相信expressjs只负责创建一系列要侦听endpoint。例如,在express.js内部:
app.get('/hello', (req, res) => {
res.send("Hello from domain");
})
app.get('/subdomain/hello', (req, res) => {
res.send("Hello from subdomain");
})
而react应用程序将只需要访问这些API,而无需考虑后端的子域和域的路由问题。我相信这就是所谓的客户端呈现,因为每个REST API都会返回要呈现的JSON数据。
那么如果我这样执行的话,我们如何根据访问的URL来确定React app要显示的页面呢?例如,如果domain.com
将指向仪表板页面,而shop.domain.com
将指向shop页面?
首先,我从来没有使用Heroku进行托管,所以我的解决方案可能与您的环境不同,但我认为整个概念将适用于您。
你的问题没有固定的答案,但我现在的想法对你有帮助:)你的问题有很多子问题,所以我把它分开了。
而且我的英语不太流利,所以你我之间可能会有一些错误的交流,如果我从你的问题中理解的有错误的话,请告诉我。
(我理解的:react app可以由SSR托管吗)
a.你可以使用代码拆分和服务器端呈现的方式为react app提供SSR服务,对于一些meta tag和SEO需要的页面最好使用服务器端呈现,除非你需要完整的SSR应用。如果您需要完整的ssr,还有一个很好的框架Next.js。你可能已经知道了这个判断,因为你提到了Vercel。
(我理解的是:react应用程序可以托管在另一个服务器上吗?NGINX=使用服务器instace,Vercel:使用无服务器架构)
A.也可以这样托管。看起来这个更像是反应。但是我不推荐Vercel托管,因为电子商务服务需要很多端点,看看Vercel的定价政策。
A.可以为计算机资源托管多个主机,也可以不托管多个主机。如果您计划多主机,您可能需要代理服务器来指向其他服务器,相反,为单主机,反向代理来指向每个应用程序。
A.没有固定答案。您可以使用vhost或express-subdomain-handler来实现您想要的目标。或者两者兼而有之。
我的解决方案概念是使用带有反向代理的单个服务器实例。让Nginx在单个服务器上虚拟化你的多个应用程序。
应用程序列表。
我使用AWS3托管React应用程序,使用EC2托管API应用程序。
( NS / DNS ) : domain.com points your-ip
|
( Server instance )
|
( Nginx ) - virtual hosting
|
( www.domain.com ) --- > client react host : ( node app for server side rendering ) : React rendered file for each route.
Or you can just respond with index.html for all route for skipping SSR
|
( api.domain.com ) --- > clinet api host : api.domain.com/what, api.domain.com/what/ever?you=want
|
( admin.domain.com ) ---> admin react host : admin.domain.com/* : sending index.html //static hosting and let all route point for index.html
|
( admin-api.domain.com ) ---> admin react host : Only if you want to seperate. Or you can combine this with api.domain.com using subrouter
如何构建结构。
I don't know much about Heroku but I guess there are aws ec2-like service(cloud computing) and s3-like service(static file service),
This can be single or multiple depending your choice. let's say you wanna go with single server and use virtual host for multiple service end point.
let's say name-server and DNS server part is network layer. I used AWS Route 53 for this.
2.1 Buy an domain
www.your-service.com
2.2 Add some CNAME to point your web-server host
- your-service.com,
- www.your-service.com
- api.your-service.com,
- admin.your-service.com
.
.
.
I'm assuming that you had one already judging by code in your question.
ubuntu@ip-your-ip:~/project$ ls
api cli admin admin-api config libraries middlewares models node_modules package.json
ubuntu@ip-your-ip:~/project$ cd api
ubuntu@ip-your-ip:~/project/api$ ls
README.md app.js bin config.json pm2.config.js node_modules package.json routes
ubuntu@ip-your-ip:~/project/api$ pm2 start pm2.config
PM2是节点应用程序的deamonizer,您可以为此使用任何守护进程。
PM2.5基准电压。https://pm2.keymetrics.io/docs/usage/application-declaration/
步骤3.nodejs应用程序的Nginx点
nano /etc/nginx/nginx.conf
listen 80;
server_name client.domain.com;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:3000;
}
listen 80;
server_name api.domain.com;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:3001;
}
listen 80;
server_name admin.domain.com;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:4000;
}
listen 80;
server_name admin-api.domain.com;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:4001;
}
希望这个解决方案对您有所帮助:)
API/和API/subdomain可以由NGINX虚拟主机嵌入,但由于您计划为subdomain提供虚拟主机,api.domain.com。
使用api.domain.com/foo,sub.domain.com/bar似乎更合理!
listen 80;
server_name api.domain.com/api;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:4000;
}
listen 80;
server_name api.domain.com/api/subdomain;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:4000;
#notice that api application is one and you are seperating namespace in it.
#you can do the same thing in Node.js with subrouter. ( check out Router API in Nodejs official Site )
}
api.domain.com/foo, sub.domain.com/bar
listen 80;
server_name api.domain.com;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:4000;#this one is node application listening port 4000
}
listen 80;
server_name sub.domain.com/;
location / {
proxy_http_version 1.1;
proxy_pass http://localhost:4001;#and this is node application listening port 4001
}
GET api.domain.com/api/foo
GET api.domain.com/api/subdomain/bar
GET api.domain.com/foo
GET sub.domatin.com/bar
S3不在EC2实例中,而是在AWS数据中心的某个地方。所以虚拟主机不是路由S3桶的解决方案。您可以使用Route53为您的域路由S3 bucket,而不是这样做。
如果您已经有域。您可以将您的名称服务器配置为指向AWS名称服务器。注册域后,您可以从Route 53控制台获取NS/DNS。
同时,静态托管react应用程序(类似于S3的托管)有一个问题,您必须放弃SSR。因为S3是一个静态主机,所以它不能像Lambda或服务器实例那样执行。
S3将为请求检索存储的文件,在这种情况下,它将是react应用程序的构建文件。所以,如果我是你,我将使用S3只用于管理反应应用程序,因为SEO在管理应用程序上并不重要。
让您的根域(www.domain.com)指向EC2中的客户端nodejs服务器。并嵌套服务器的react构建文件。React SSR app via Express解释起来相当复杂,但有很多例子,所以你可能需要谷歌一下。
离题,我在S3上建立了我的电子商务react应用程序,我很后悔做这件事,因为SSR部分不容易。关于它的解决方案有很多,但其中的一个,Next.js框架似乎是最好的选择,以尽快完成ssr。
问题内容: 有没有办法在 Symfony2中 设置基于主机名的路由? 在官方文档中没有找到关于此主题的任何信息。 http://symfony.com/doc/2.0/book/routing.html 我想基于给定的主机名路由请求: 因此,从本质上讲,控制器将获得作为参数传递的当前子域。 我希望这是可能的,而我只是以某种方式错过了它。 提前致谢! 问题答案: 这是我的解决方案: 在内部应用程序目
问题内容: 我已经尝试了许多npm软件包来验证电子邮件地址和域名。这是我尝试过的一些npm软件包 所有这些都会导致域名存在以及仅进行其他一些检查。但是我必须验证域中是否存在特定的电子邮件地址。我应该如何实现呢? 有人可以帮我找出来 吗 ? 谢谢! 问题答案: 今天(可能永远不会),无法以编程方式验证电子邮件地址。 出于安全和隐私原因,服务器不会允许这样做。 并且有充分的理由。通过这种解决方案,垃圾
我有两个问题。我理解,如果我在cookie中指定域为(带前导点),那么所有子域都可以共享一个cookie。 是否可以访问在中创建的cookie(没有子域)? 如果在中创建,(没有子域)是否可以访问cookie?
问题内容: 我要转发的所有请求: www.domain.com/ api / whaterver / comes / next– api .domain.com / whatever / comes / next 原因是避免www.domain.com的浏览器CORS请求api.domain.com 可能值得一提的是,nginx在Docker容器中运行。 我试图用下面的位置块来完成,但是失败了:
我在本地环境中创建了一个带有Laravel 7的网络应用程序,它有一个选项,用户可以上传和更改他们的个人资料图像。它在当地环境中运行良好。最近我把这个项目上传到一个子域下的实时服务器上。我把所有公共文件放在子域文件夹中,其他文件放在根文件夹中。像这样。 文件结构 现在当我运行 它将文件/public/images中的图像上传到hello中。实例com/images 文件上载代码:
问题内容: 我正在一个具有多个子域的站点上,其中一些应该具有自己的会话。 我想我已经解决了,但是注意到了一些我不理解的关于cookie处理的信息。我在文档中看不到有任何解释它的内容,因此我想我可以看看这里是否有人对此问题有所了解。 如果我只是这样做: 我最终得到了这样的会话cookie: subdomain.example.net 但是,如果我尝试自己设置Cookie域,无论是 或喜欢 我最终获得