最近的一个项目是在apache上部署webxian项目,踩了很多坑。这里简单记录一下自己踩过的坑以及有一些要注意的问题,我是用的apacheWindows版本是2.4.41:
我来简单说一下我这个项目的跨域问题,就是在这个相当于一个纯前端的问题,然后数据都是从一个接口中获取的,然后这样部署上去的话不是同源,这就产生了跨域问题。如果想详细了解一下这个跨域问题以及原理,这里我看到这篇文章很不错分享给大家,下面是链接(侵删)
跨域问题是怎样造成的:https://www.cnblogs.com/vwvwvwgwg/p/12805211.html
然后因为我用的服务器是apache,这里就说一下apache解决跨域问题是设置了一个反向代理,通过在apache里面配置自己访问接口的地址来解决。
如果你是Windows的apache:就在自己的 httpd.conf (这个文件夹一般都在 apache2.4.41/conf/httpd.conf)里面,把下面四行取消注释(去掉前面的#)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
就是调用这四个模块,这四个模块的作用是正反向代理,负载均衡,url重写。
然后同在这个文件里把这行注释取消掉:
Include conf/extra/httpd-vhosts.conf
然后这个基本配置就改完了,剩下所有的虚拟主机的配置都在httpd-vhosts.conf(这个一般在apache2.4.41/conf/extra/httpd-vhosts.conf)文件中配置。我这里展示一下我的配置:
ServerAdmin [email protected]
DocumentRoot "${INSTALL_DIR}/www/dist/"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
CustomLog "logs/dummy-host.example.com-access.log" common
Order deny,allow
Allow from all
ProxyPass /api http://*.*.*.*/
简单解释一下上面这个就是在80端口里面配置,要改的地方只有 DocumentRoot "${INSTALL_DIR}/www/dist/" 这行, 我这个意思是把根目录设置成了www.dist。这是Wampserver中的apache所以生成的static和index那两个部署文件我就放在这个www/dist里面了,如果不是Wampserver中的apache而是直接的apache,就把这个路径改成 DocumentRoot "${INSTALL_DIR}/htdocs/ (一般自带的都叫htdocs)。
反向代理设置的话就就是ProxyPass 在这个位置添加自己要请求的接口。
Linux版本的apache和上述唯一的不同的就是在加载那四个模块时候(取消注释四行)的时候有一点区别,如果想给apache2添加什么功能模块,直接建立一个从avalible中建立一个快捷方式到enabled中就行了,删除也是一样,删掉enabled中的某模块的快捷方式就行了。这个具体目录结构可以查看这篇大佬的博客(侵删):
Apache2配置目录分析(详细版):https://blog.csdn.net/stay_zezo/article/details/80212552
这样通过反向代理跨域问题就解决啦(这里有一个小问题,如果你复制我的配置然后改,比如你要复制到Linux里面可能编码有问题需要自己手动打一遍,这个坑就踩了很久)!!!
这个项目在部署的时候因为默认的host模式发现部署上去打不开,因为#缘故。vue默认用的是hash模式,但是hash模式下url需要带“#”符号,不仅看起来不舒服,而且有些场景下是会破坏路由中的"#"(微信分享页面就会把"#"后边的内容处理掉,需要将带参的url作为一个参数传给后台,后台取不到#后面的东西),所以这里就照着教程来更改history模式,官网其实有说到这一点,这里是官网的链接,但是很多人直接加了mode:history这句话, 加上之后发现确实可以打开,但是刷新就不行了。会报服务器访问的错误,官网也说了apache配置,这个配置大家网上写的很乱,很多复读机,我这里也来复读一位大佬的成功可行详细的。大佬的链接(侵删):https://www.cnblogs.com/xhq1024/p/12626913.html
新建一个txt,里面写上如下内容:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
更改文件名为: .htaccess (前面有个点)
把该文件放到和index.html同级,如下图:
然后就要设置apache支持mod_rewrite。
找到apache安装目录 etc/httpd/conf/ 下的 httpd.conf 文件
找到“LoadModule rewrite_module modules/mod_rewrite.so”,将前面的"#"号删除。
(如果没有找到,则新增一行,必须独占一行)
设置apache服务支持.htaccess
修改httpd.conf -> "AllowOverride None" 为 "AllowOverride All"
然后重启服务器就可以了。
下面来说一下我踩的坑,我发现这样操作了还是不行。然后发现css样式不能识别,以及我在static里面配置了一个config.js不能识别。这里说明一下,history模式下所有文件必须是绝对路径不能是相对路径,不然还是会404。
之前部署css样式不生效我曾经在config/index.js目录下改了这个,为了醒目我特意改成了中文句号。
之前在host模式加了. (点)现在history模式直接去掉就好了,改成绝对路径。我还有一个文件夹是自己在static里面写了config.js,目录结构如下,就需要在index里面把相对路径也改成绝对路径。
总之就是相对路径都换成绝对路径,好了大概这样就完工啦