You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2 Apache本地站点HTTPS配置及自定义域名访问故障求助

WSL2 Apache HTTPS配置问题说明

我需要为WSL中运行的Apache本地站点配置HTTPS访问,目前已尝试两天仍未解决,参考了多篇公开同类教程仍未解决。

已完成的前置操作:

  • 已在Windows和WSL2中均安装了mkcert
  • 先在管理员权限的PowerShell中执行以下命令,在C:\Users\YOUR_WINDOWS_USERNAME\AppData\Local\mkcert路径下生成证书:
mkcert -install
mkcert localhost 127.0.0.1 ::1 0.0.0.0

操作执行成功,对应目录下可看到生成的证书文件。

  • 在PowerShell中执行以下命令时失败:
setx CAROOT "$(mkcert -CAROOT)"; If ($Env:WSLENV -notlike "*CAROOT*") { setx WSLENV "CAROOT/up:$Env:WSLENV" }

因此改为在WSL终端中执行如下命令配置环境变量:

echo 'export CAROOT=/mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert' >> ~/.profile

以此让WSL端的mkcert使用Windows侧生成的证书,配置生效,执行mkcert -CAROOT命令可返回正确路径:

/mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert

问题1 默认SSL配置修改后访问异常

未修改default-ssl.conf的前提下,https://localhost已可访问(需手动确认接受证书风险),当前default-ssl.conf内容如下:

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on

        SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
        
    SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

    </VirtualHost>
</IfModule>

此时可正常加载Apache默认页面,但将DocumentRoot修改为Windows侧的站点文件存储路径后:

DocumentRoot /mnt/c/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html

访问https://localhost提示“Connection failed: No such file or directory”,已确认对应目录下存在index.php和index.html文件。
即便同步修改证书和密钥路径为正确的mkcert生成文件路径也无效果:

SSLCertificateFile     /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/localhost+3.pem
SSLCertificateKeyFile  /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/localhost+3-key.pem

重启Apache无报错,可确认路径填写正确、目录真实存在。


核心需求未实现:自定义域名HTTPS访问

目标是实现https://example.com的HTTPS访问,已做操作如下:

  1. 已执行命令生成对应域名的证书,确认文件已生成:
mkcert example.com
  1. Windows的Hosts文件已配置如下映射:
127.0.0.1   example.com
127.0.0.1   www.example.com
  1. 已启用example.com.conf配置:
<VirtualHost *:80>
  ServerName example.com
  ServerAlias www.example.com
  ServerAdmin webmaster@localhost
  DocumentRoot /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html
  ErrorLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/error.log
  CustomLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/access.log combined

  <Directory /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html>
    Require all granted
  </Directory>
</VirtualHost>
  1. 已启用example.com.ssl.conf配置:
<IfModule mod_ssl.c>
  <Directory /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html>
    Require all granted
    DirectoryIndex index.php index.html
  </Directory>
  <VirtualHost example.com:443>
    SSLEngine on
    SSLCertificateFile    /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/example.com.pem
    SSLCertificateKeyFile /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/example.com-key.pem
    ServerName example.com
    ServerAlias www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html

    ErrorLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/error.log
    CustomLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/access.log combined

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>
    </VirtualHost>
</IfModule>

此时在浏览器访问example.com或https://example.com,Chrome提示“无法访问此网站 / ERR_CONNECTION_REFUSED”,Firefox提示“无法连接”。

注:路径中的YOUR_WINDOWS_USERNAME为占位符,实际配置时已替换为正确的Windows用户名。


问题更新

已将Hosts文件修改为如下内容:

127.0.0.1   example.com
127.0.0.1   www.example.com

::1         example.com
::1         www.example.com

同时将所有站点相关路径修改为WSL侧的路径:

DocumentRoot /home/LINUX_USERNAME/dev/www/example.com/public_html

修改后可加载Apache2/Ubuntu默认页面,但无法加载public_html目录下的index.php文件内容,访问https://example.com/index.php返回404 Not Found错误。


解决方案

1. 基础配置修正

首先确认Apache必要模块已启用,在WSL终端执行命令:

sudo a2enmod ssl rewrite
sudo systemctl restart apache2

同时修正SSL虚拟主机的监听配置,将example.com.ssl.conf中的<VirtualHost example.com:443>改为<VirtualHost *:443>,避免域名绑定解析异常。

2. 404问题排查

  • 确认WSL侧站点目录的权限正确,执行命令:
sudo chown -R www-data:www-data /home/LINUX_USERNAME/dev/www/example.com/public_html
sudo chmod -R 755 /home/LINUX_USERNAME/dev/www
  • 检查是否有默认虚拟主机优先级高于自定义站点,执行命令查看已启用的虚拟主机列表:
sudo a2query -s

如果000-default.conf或default-ssl.conf排在前面,可选择禁用默认配置:

sudo a2dissite 000-default.conf default-ssl.conf
sudo systemctl restart apache2
  • 查看Apache错误日志定位具体原因:
sudo tail -f /var/log/apache2/error.log

3. 证书信任问题解决

把mkcert生成的根证书导入到Windows的受信任根证书颁发机构路径下,避免浏览器提示证书风险:在WSL中找到rootCA.pem文件(路径为$CAROOT/rootCA.pem),双击在Windows中打开,按提示导入到「受信任的根证书颁发机构」存储区即可。

4. 端口映射排查

如果仍出现连接拒绝问题,确认WSL2的443端口已正常监听,执行命令:

sudo netstat -tulpn | grep apache2

确认输出中存在443端口的监听记录即可。


内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:45:04