nuxt-community / redirect-module

No more cumbersome redirects for Nuxt 2!
MIT License
310 stars 17 forks source link

Module not working in production after deploying #110

Open vserdobintsev opened 2 years ago

vserdobintsev commented 2 years ago

When I run the project locally in dev or prod mode, everything works. But after I deploy it on a remote server, the module does not work.

The same problem caught up with me when using the @nuxtjs/sitemap module. But you can still survive this.

danielroe commented 2 years ago

Would you provide a reproduction? How is your site deployed? Might it be in your buildModules or devDependencies?

vserdobintsev commented 2 years ago

The web server is configured in this way: nginx proxies requests to localhost:3000, where the project is deployed using pm2. I use skeleton Nuxt and Laravel: https://github.com/cretueusebiu/laravel-nuxt

nuxt.config.js

I will shorten the code of my nuxt.config.js to make it easier to learn.

` import path from 'path' import fs from 'fs' import CopyWebpackPlugin from 'copy-webpack-plugin'

require('dotenv').config() const { join } = require('path')

module.exports = { ssr: true,

srcDir: __dirname,

server: { https: { key: fs.readFileSync(path.resolve(dirname, 'domain.key')), cert: fs.readFileSync(path.resolve(dirname, 'domain.crt')) } }, env: { // ... }, head: { htmlAttrs: { // ... }, meta: [ // ... ], script: [ // ... ], link: [ // ---- favicons ---- { rel: 'shortcut icon', sizes: '32x32', type: 'image/x-icon', href: '/_nuxt/meta/icons/favicon.ico' }, ] }, plugins: [ '~components/global', '~plugins/i18n', '~plugins/fontawesome', '~plugins/axios', '~plugins/nuxt-client-init', '~plugins/vue-burger', '@plugins/v-mask.js', '~plugins/pages-core', { src: '~plugins/vue-ymaps', mode: 'client' } ], sitemap: { gzip: true, cacheTime: 1000 60 60 24, defaults: { lastmod: process.env.SITEMAP_LASTMOD, changefreq: 'weekly' }, async routes () { const routes = (await import('./utils/routes/routes')).default const result = [] for (let index = 0; index < routes.length - 1; index++) { const route = routes[index] if ('children' in route) { for (let childIndex = 0; childIndex < route.children.length; childIndex++) { const child = route.children[childIndex] result.push(child.name.replace('.', '/').replace('index', '')) } continue } result.push(route.path) } return result } }, redirect: [ { from: '^/service/(.)$', to: '/services/$1', statusCode: 301 }, ...require('./config/redirects.json') ], modules: [ '@nuxtjs/router', 'vue-sweetalert2/nuxt', '@nuxtjs/style-resources', '@nuxtjs/axios', ['@nuxtjs/html-minifier', { log: 'once', logHtml: true }], ['@naumstory/nuxtjs-yandex-metrika', { id: process.env.YANDEX_METRIKA_ID, webvisor: true, clickmap: true, trackLinks: true, accurateTrackBounce: true }], '@nuxtjs/sitemap', '@nuxtjs/robots', '@nuxtjs/redirect-module' ], build: { extractCSS: true, plugins: [ new CopyWebpackPlugin([ { from: './client/static/meta', to: './meta' } ]) ] }, buildModules: [ ['@nuxtjs/vuetify', { theme: { disable: true }, treeShake: true, defaultAssets: false, icons: { iconfont: 'md' } }] ] } `

dependencies and devDependencies

{ "dependencies": { "@fortawesome/fontawesome-free": "^5.15.2", "@fortawesome/fontawesome-svg-core": "^1.2.34", "@fortawesome/free-brands-svg-icons": "^5.15.2", "@fortawesome/free-regular-svg-icons": "^5.15.2", "@fortawesome/free-solid-svg-icons": "^5.15.2", "@fortawesome/vue-fontawesome": "^2.0.2", "@naumstory/nuxtjs-yandex-metrika": "^1.0.5", "@nuxtjs/axios": "^5.13.1", "@nuxtjs/html-minifier": "^0.1.2", "@nuxtjs/redirect-module": "^0.3.1", "@nuxtjs/robots": "^2.5.0", "@nuxtjs/router": "^1.5.0", "@nuxtjs/sitemap": "^2.4.0", "axios": "^0.21.1", "copy-webpack-plugin": "github:webpack-contrib/copy-webpack-plugin#v5", "cssnano": "^4.1.10", "dotenv": "^8.2.0", "fs": "^0.0.1-security", "js-cookie": "^2.2.1", "json-loader": "^0.5.7", "lunr": "^2.3.9", "nuxt": "^2.15.7", "pexels": "^1.0.1", "sweetalert2": "^10.14.0", "typescript": "^4.1.3", "v-mask": "^2.2.4", "vform": "^1.0.1", "vue": "^2.6.14", "vue-burger": "^1.1.0", "vue-i18n": "^8.22.4", "vue-server-renderer": "^2.6.14", "vue-sweetalert2": "^4.2.0", "vue-yandex-maps": "^0.10.12" }, "devDependencies": { "@babel/eslint-parser": "^7.12.13", "@nuxtjs/eslint-config": "^5.0.0", "@nuxtjs/style-resources": "^1.0.0", "@nuxtjs/vuetify": "^1.11.3", "eslint": "^7.19.0", "fs-extra": "^9.1.0", "node-sass": "^5.0.0", "postcss-combine-media-query": "^1.0.1", "sass-loader": "^10.1.1" } }

nginx conf file

upstream pm2_my_domain {
server 127.0.0.1:3000;

}

server { listen 80; server_name my-domain.com; rewrite ^ https://$host$request_uri permanent; }

server { listen 80; server_name www.my-domain.com; rewrite ^ https://$host$request_uri permanent; }

server { listen 443 ssl http2; server_name my-domain.com; root /var/www/project/; index index.php index.html index.htm; access_log /var/www/logs/ssl-access.log main; error_log /var/www/logs/ssl-error.log;

keepalive_timeout       60;
ssl_certificate     /etc/letsencrypt/live/my-domain.com/fullchain.pem;
ssl_certificate_key     /etc/letsencrypt/live/my-domain.com/privkey.pem;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers '-------------SOME DATA----------------';
ssl_dhparam         /etc/ssl/certs/dhparam.pem;
add_header          Strict-Transport-Security 'max-age=604800';

gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_min_length 1100;
gzip_buffers     4 8k;
gzip_proxied any;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/json
application/xml
application/rss+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;

gzip_static on;

gzip_proxied        expired no-cache no-store private auth;
gzip_disable        "MSIE [1-6]\.";
gzip_vary           on;

location ~ /\.ht {
deny all;
}
location ^~ /content {
alias /var/www/project/public/content/;
expires 30d;
}
location = /robots.txt {
alias /var/www/project/public/robots.txt;
}
location = /sitemap.xml {
alias /var/www/project/public/sitemap.xml;
}
location /phpmyadmin {
  alias /usr/share/phpMyAdmin/;
  location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    include fastcgi_params;
    fastcgi_ignore_client_abort off;    
  }
  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    access_log    off;
    log_not_found    off;
    expires 1M;
  }
}
location / {
# Force index.php routing (if not found)
# try_files $uri $uri/ /index.php?$query_string;

# Force index.php routing (all requests)
# rewrite ^/(.*)$ /index.php?/$1 last;

# limit_conn   addr 16;
# limit_req    zone=flood        burst=32 nodelay;

# add_header   X-Frame-Options   'SAMEORIGIN' always;
# add_header   Referrer-Policy   'no-referrer-when-downgrade' always;

# CSP syntax: <host-source> <scheme-source>(http: https: data: mediastream: blob: filesystem:) 'self' 'unsafe-inline' 'unsafe-eval' 'none'
# Content-Security-Policy-Report-Only (report-uri https://site.com/csp/)
# add_header   Content-Security-Policy  "default-src 'self'; connect-src 'self'; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; base-uri 'none'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requests" always;

proxy_set_header          Host $host;
proxy_set_header          X-Forwarded-For $http_x_forwarded_for;
proxy_set_header          X-Real-IP $remote_addr;
proxy_set_header          X-Forwarded-Proto $scheme;
proxy_http_version        1.1;
proxy_set_header          Upgrade $http_upgrade;
proxy_set_header          Connection 'upgrade';
proxy_cache_bypass        $http_upgrade;
proxy_pass                http://pm2_my_domain;
}

location /_nuxt/ {
    alias /var/www/project/.nuxt/dist/client/;
}

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|srt|swf|woff|woff2|svg)$ {
    rewrite ^/_nuxt(/.*) $1 break;
    root /var/www/project/.nuxt/dist/client/;
    expires 30d;
}
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
access_log off;
expires max;
}

location /api/ {
fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /var/www/project/public/index.php;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
include fastcgi_params;
fastcgi_param HTTPS on;
}

location = /favicon.ico {
log_not_found off;
access_log off;
}

}

server { listen 443 ssl http2; server_name www.my-domain.com; rewrite ^ https://my-domain.com$request_uri? permanent; }

vserdobintsev commented 2 years ago

@danielroe, I found your comments on this topic here https://github.com/nuxt/nuxt.js/issues/9158#issuecomment-820676790 and here https://github.com/nuxt/nuxt.js/issues/8230#issuecomment-727628488. What do you recommend? Is there any sample code that can be written to start middleware in production mode deployed on the server?

Xyeut commented 6 months ago

Hey! did you ever fix this?

vserdobintsev commented 6 months ago

Hey! did you ever fix this?

As far as I remember, I did not find a solution