ฉันได้ติดตั้งMauticในโฟลเดอร์ย่อยเช่น: example.com/m
Mautic ส่วนใหญ่ทำงานได้ดีกับการกำหนดค่าของฉัน (แผงผู้ดูแลระบบ การใช้ Mautic เป็นต้น) แต่สำหรับการเปลี่ยนเส้นทางในโฟลเดอร์ย่อยของฉัน ฉันได้รับ404:

example.com/m 200
example.com/m/form/9 200
example.com/m/form/generate.js?id=9 404

(/ ไม่มีแบบฟอร์ม - ควรเปลี่ยนเส้นทาง/สร้างโดย Mautic แบบไดนามิก)

ไฟล์ทั้งหมดในระบบไฟล์เป็นของ www-data

nginx conf ของฉันสำหรับโฮสต์:

server {
    server_name www.example.com;
    rewrite_log on;

    root /var/www/example.com/www.example.com;
    index index.php index.html index.htm;

    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log notice;

    #######################################
    ##  Start Mautic Specific config #####
    #######################################

    location /m {
        # Working despite forms:
        try_files $uri $uri/ /m/?q=$uri&$args;
    }

    #######################################
    ##  End Mautic Specific config #####
    #######################################

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }

    # A long browser cache lifetime can speed up repeat visits to your page
    location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
       access_log        off;
       log_not_found     off;
       expires           360d;
    }

    # disable access to hidden files
    location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
    }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/stats.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/stats.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    listen 443 ssl;
    server_name example.com;
    listen [::]:443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/stats.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/stats.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    return 301 https://www.example.com$request_uri;

}

server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name example.com www.example.com;
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
    #return 404; # managed by Certbot

}

ผมทำอะไรผิดหรือเปล่า?

answer

คุณต้องการ/mให้location /mบล็อกจัดการURI ที่ขึ้นต้นด้วย

อย่างไรก็ตามสถานที่แสดงออกปกติจะมีความสำคัญดังนั้น URI /m/form/generate.jsที่เป็นจริงถูกจัดการโดยสถานที่ตั้งที่ตรงกับ URI .jsของทั้งหมดที่ปลายอีกด้วย ดูเอกสารนี้

มี^~โอเปอเรเตอร์ที่บังคับให้ตำแหน่งนำหน้ามีความสำคัญกว่า แต่จะใช้งานไม่ได้ในกรณีของคุณ เนื่องจากแอปพลิเคชันคือ PHP และคุณต้องการ URI ที่ลงท้ายด้วยบล็อก.phpเพื่อจัดการlocation ~ \.php$

ดังนั้น เราขอแนะนำให้คุณซ้อนlocationสาเหตุของปัญหาภายในlocation /บล็อกแทน

ตัวอย่างเช่น:

location /m {
    try_files $uri $uri/ /m/?q=$uri&$args;
}

location / {
    try_files $uri $uri/ /index.php$is_args$args;

    location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
        access_log        off;
        log_not_found     off;
        expires           360d;
    }
}

location ~ \.php$ {
    ...
}

location ~ /\.ht {
    ...
}