Django + Apache + Начальная загрузка с мобильного вместо страницы обслуживания - PullRequest
0 голосов
/ 27 января 2020

У меня есть веб-приложение, которое использует следующий технический стек:

  • Apache, работающий в инстансе Amazon EC2
  • Django, обслуживающий через WSGI
  • Javascript скомпилировано через webpack / babel

В настольной среде все отлично работает, но на мобильных устройствах она полностью не работает. Когда я перехожу на домашнюю страницу, мобильные браузеры пытаются начать загрузку, а не обслуживать страницу.

enter image description here

Я несколько дней бился головой о стену, пытаясь понять, что происходит, но у меня нет любые ведет.

Вот мой webpack.config. js, так как я думаю, что это наиболее вероятное место для проблемы:

const path = require('path');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
const BundleTracker = require('webpack-bundle-tracker');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const SentryCliPlugin = require('@sentry/webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

const devMode = process.env.NODE_ENV !== 'production';
const hotReload = process.env.HOT_RELOAD === '1';


const styleRule = {
  test: /\.(sa|sc|c)ss$/,
  use: [
    MiniCssExtractPlugin.loader,
    { loader: 'css-loader', options: { sourceMap: true } },
    {
      loader: 'postcss-loader',
      options: {
        plugins: () => [autoprefixer({
          overrideBrowserslist: [
            'last 2 Chrome versions',
            'not Chrome < 60',
            'last 2 Safari versions',
            'not Safari < 10.1',
            'last 2 iOS versions',
            'not iOS < 10.3',
            'last 2 Firefox versions',
            'not Firefox < 54',
            'last 2 Edge versions',
            'not Edge < 15',
          ],
        })],
      },
    },
    'sass-loader',
  ],
};

const jsRule = {
  test: /\.js$/,
  include: [
    path.resolve('./'),
  ],
  exclude: [/node_modules/, /lib/],
  use: [
    'babel-loader',
    {
      loader: 'eslint-loader',
      options: {
        fix: true,
        presets: ['@babel/preset-es2015'],
      },
    },
  ],
};

const assetRule = {
  test: /.(jpg|png|woff(2)?|eot|ttf|svg)$/,
  loader: 'file-loader',
};

const plugins = [
  new webpack.ProvidePlugin({
    'window.jQuery': 'jquery',
    jQuery: 'jquery',
    $: 'jquery',
  }),
  new BundleTracker({ filename: './webpack-stats.json' }),
  new MiniCssExtractPlugin({
    filename: devMode ? '[name].css' : '[name].[hash].css',
    chunkFilename: devMode ? '[id].css' : '[id].[hash].css',
  }),
  new BundleAnalyzerPlugin({ analyzerMode: 'static', openAnalyzer: false }),
  new webpack.HotModuleReplacementPlugin(),
  new CleanWebpackPlugin(),
  // new CleanWebpackPlugin(['./static/dist']),
  new CopyWebpackPlugin([
    { from: './static/src/images/**/*', to: path.resolve('./static/dist/images/[name].[ext]'), toType: 'template' },
  ]),
];

if (devMode) {
  styleRule.use = ['css-hot-loader', ...styleRule.use];
} else {
  plugins.push(
    new webpack.EnvironmentPlugin(['NODE_ENV']),
  );
  if (process.env.SENTRY_DSN) {
    plugins.push(
      new SentryCliPlugin({
        include: '.',
        release: process.env.SOURCE_VERSION,
        ignore: ['node_modules', 'webpack.config.js'],
      }),
    );
  }
}

module.exports = {
  context: __dirname,
  entry: {
    app: './wzapp/global_web_source/app.js',
    main: './main/web_src/app.js',
    coop: './coop/web_src/app.js',
    wdns: './wdns/web_src/app.js',
  },
  output: {
    path: path.resolve('./static/dist/'),
    filename: '[name]-[hash].js',
    publicPath: hotReload ? 'https://localhost:8080/' : '',
  },
  devtool: devMode ? 'cheap-eval-source-map' : 'source-map',
  devServer: {
    hot: true,
    quiet: false,
    https: {
      key: 'server.key',
      cert: 'server.crt',
    },
    headers: { 'Access-Control-Allow-Origin': '*' },
  },
  module: { rules: [jsRule, styleRule, assetRule] },
  plugins,
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        cache: true,
        parallel: true,
        sourceMap: true, // set to true if you want JS source maps
      }),
      new OptimizeCSSAssetsPlugin({}),
    ],
    splitChunks: {
      cacheGroups: {
        commons: {
          name: 'commons',
          chunks: 'initial',
          minChunks: 2,
        },
      },
    },
    // splitChunks: {
    //   cacheGroups: {
    //     commons: {
    //       test: /[\\/]node_modules[\\/]/,
    //       name: 'vendor',
    //       chunks: 'initial',
    //     },
    //   }
    // }
  },
};

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Спасибо @yoomama за указание в правильном направлении. Оказывается, проблема была в моей конфигурации wsgi и некоторых заголовках, которые нужны мобильным сайтам. Я изменил свой wsgi.py, чтобы добавить конфигурацию Middleware, чтобы исправить это следующим образом:

from django.core.wsgi import get_wsgi_application

class Middleware(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):

        def custom_start_response(status, headers, exc_info=None):
            headers.append(('Content-Type', "text/html; charset=ISO-8859-1"))
            headers.append(('Cache-Control', "no-cache"))
            return start_response(status, headers, exc_info)

        return self.app(environ, custom_start_response)

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wzapp.settings')

app = get_wsgi_application()

application = Middleware(app)
0 голосов
/ 27 января 2020

Поцарапайте все мои предыдущие комментарии. Вот запрос скручивания:

curl -vvv apps-staginy.uszel 
> 
< HTTP/1.1 200 OK
< Date: Mon, 27 Jan 2020 02:37:18 GMT
< Content-Type: <wsgirequest: get '/'>
< Content-Length: 2821
< Connection: keep-alive
< Server: Apache/2.4.41 () PHP/5.4.16 mod_wsgi/4.6.8 Python/3.7
< Upgrade: h2,h2c
< X-Frame-Options: SAMEORIGIN

Обратите внимание на тип содержимого ... Что-то не так с вашей конфигурацией Apache. Я считаю, что это потому, что Django не может обслуживать субдомены, пока вы не загрузите пакет. Я использую Safari OSX, и он загрузил файл, но в Google Chrome этого не произошло.

Редактировать 1: Ваш текущий веб-сайт не находится на поддомене. Я думаю, что ваша конфигурация Babel должна перенаправить меня к этому

< HTTP/1.1 301 Moved Permanently
< Date: Mon, 27 Jan 2020 02:44:32 GMT
< Content-Length: 0
< Connection: keep-alive
< expires: -1
< location: https://www.wizely.us/
< x-seen-by: gv/XVF9HsGpk8A2KWukUzOwfbs+7qUVAqsIx00yI78k=,BTzakfJUbU/4CBguyutVdw7fAhTBvcXRsSG6ZgbhvQs=,1wy2ILu/S4rlWT/R4rqCrUa3k5dNGUFx8V61B2dxvEc=,LWZ6Tylfijl32cnmU7+qjL+1H2A1RrmXQxSZltmzRpFGp/J3MBzgzU8QHrQuh4zQ,nxVDKlf5lZ8xGkFSmm2J1uKPSHBdc9xPwY1nZvlDEaqXDJjWFZJonuG0MMyDy/pKSJ1s0Omld5LJBBda8omfzA==
< cache-control: no-cache
< content-language: en
< X-Wix-Request-Id: 1580093072.79516762495826127415
< 
* Connection #0 to host wizely.us left intact
* Closing connection 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...