我正在使用 vitejs 开发一个新的 laravel 11 应用程序,并尝试使用 Docker 部署它。一切在本地运行良好(使用 Docker Desktop),实时部署本身正在运行,但我的资产(css 和 js)是使用 HTTP 而不是 HTTPS 调用的,这会导致 (blocked:mixed-content) 错误。
该部分由 vitejs 处理,应该是自动的。我之前使用相同的配置部署了 laravel 8 项目,并且使用 HTTPS 调用资产。我的 Docker 配置中唯一改变的是我使用 php 8.2 而不是 8.1...vitejs 配置完全相同。
我尝试了几次更改,但无法使其发挥作用
我的 vite.config.js 文件:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
input: [
'resources/sass/style.scss',
'resources/js/app.js',
],
refresh: true,
}),
],
// base: process.env.APP_URL || '/',
// server: {
// https: true,
// },
build: {
manifest: true,
outDir: 'public/build',
emptyOutDir: true,
rollupOptions: {
output: {
assetFileNames: '[name]-[hash][extname]',
},
},
},
});
我尝试过使用和不使用
base
、server
和 build
。一切都没有改变。
我的.env 文件:
APP_NAME=Laravel
APP_ENV=production
APP_KEY=setbutnotshown
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=https://myapp.example.com
除了数据库数据正确外,其余部分没有改变。我可以运行迁移。
我的 Dockerfile :
# Base image
FROM php:8.2-apache
# Set working directory in the container
WORKDIR /var/www/html
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
g++ \
curl \
libzip-dev \
libjpeg-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
libpng-dev \
libwebp-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
&& rm -rf /var/lib/apt/lists/*
# Configure GD extension
RUN docker-php-ext-configure gd \
--with-freetype=/usr/include/ \
--with-jpeg=/usr/lib/x86_64-linux-gnu \
--with-webp=/usr/lib/x86_64-linux-gnu
# Install PHP extensions
RUN docker-php-ext-install -j$(nproc) gd pdo_mysql mbstring exif pcntl bcmath zip
# Configure Apache
RUN echo "ServerName laravel-app.local" >> /etc/apache2/apache2.conf
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN a2enmod rewrite headers
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Install Node.js (latest LTS version)
RUN apt-get update && curl -sL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npm
# Copy the application files and set permissions
COPY --chown=www-data:www-data . /var/www/html
# Install PHP dependencies
RUN composer install --no-dev --optimize-autoloader
# Install Node.js dependencies and build assets
RUN npm install
RUN npm run build
# Set proper permissions for storage and bootstrap cache
# RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache /var/www/html/public
# Expose port 80
EXPOSE 80
# Start Apache in foreground
CMD ["apache2-foreground"]
我的docker-compose.yml
version: '3.8'
services:
my-app:
build:
context: .
container_name: my-app
ports:
- "9005:80"
volumes:
- .:/var/www/html
- ./storage:/var/www/html/storage
- ./bootstrap/cache:/var/www/html/bootstrap/cache
env_file:
- .env
我尝试过使用和不使用
volumes
,但也没有任何变化。
我检查了 apache 配置文件,一切都正确。 SSL、服务器名称...
我找到了解决方案...我在我的
ASSET_URL
文件中的 APP_URL
下面添加了一行 .env
,现在它可以工作了。
APP_URL=https://myapp.example.com
ASSET_URL=https://myapp.example.com