非 root url 下由 nginx 提供的 Wordpress 服务

非 root url 下由 nginx 提供的 Wordpress 服务

我正在尝试将我的服务器从 apache 移至 Nginx,从博客开始。博客只是网站的一部分,应该在 /blog/admin 下可用(我仅使用 WordPress 作为后端)。

在 apache 中我使用目录指令和别名:

    Alias /blog/admin /var/www/wordpress

    <Directory /var/www/wordpress>
            Options +FollowSymLinks -Indexes
            AllowOverride Limit Options FileInfo
            DirectoryIndex index.php
            Require all granted
    </Directory>

我不知道如何在 nginx 下模仿这种行为。到目前为止,我有一个可以正常工作的 wordpress,其功能如下:

server {
        listen 80;
        root /var/www/wordpress;
        index index.php index.html index.htm;
        server_name my-domain.net;

        access_log /var/log/nginx/wordpress_access.log;
        error_log /var/log/nginx/wordpress_error.log;

        client_max_body_size 64M;

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

        location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_read_timeout 3600s;
                fastcgi_buffer_size 128k;
                fastcgi_buffers 4 128k;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                fastcgi_index index.php;
        }
}

我玩过:

server {
        listen 80;
        root /var/www/wordpress;
        index index.php index.html index.htm;
        server_name my-domain.net;

        access_log /var/log/nginx/wordpress_access.log;
        error_log /var/log/nginx/wordpress_error.log;

        client_max_body_size 64M;

        location /blog/admin {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_read_timeout 3600s;
                fastcgi_buffer_size 128k;
                fastcgi_buffers 4 128k;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                fastcgi_index index.php;
        }
}

但没有成功。wordpress 仍然可用my-domain.net(但不应该可用),但在 下不可用my-domain.net/blog/admin

唯一的区别是my-domain.net/blog/admin返回状态 302 并将我重定向到根my-domain.net/

我怎样才能实现与 apache 相同的行为?

为了更清楚起见 - Wordpress 安装的目录:

/var/www/wordpress

Wordpress 可用的 URL 为:

domain.com/blog/admin

我已经尝试更新配置,感谢@Paul

server {
        listen 80;
        # The root directive here sets the default root directory for the entire server block, unless configured otherwise in a location block
        root /var/www;
        index index.php index.html index.htm;
        server_name my-domain.net;

        access_log /var/log/nginx/wordpress_access.log;
        error_log /var/log/nginx/wordpress_error.log;

        client_max_body_size 64M;

        location /blog/admin/ {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ /blog/admin/.*\.php$ {
                root /var/www/wordpress;
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_read_timeout 3600s;
                fastcgi_buffer_size 128k;
                fastcgi_buffers 4 128k;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                fastcgi_index index.php;
        }

}

不幸的是,/blog/admin/ 并没有指向 wordpress 安装目录

2022/08/18 15:27:42 [error] 70754#70754: *1 open() "/var/www/index.php" failed (2: No such file or directory), client: 79.175.220.248, server: my-domain.net, request: "GET /blog/admin/ HTTP/1.1", host: "my-domain.net"

答案1

我认为您的输出不是您想要的输出,但听起来像是预期的输出。

可能工作:

server {
        listen 80;
        # The root directive here sets the default root directory for the entire server block, unless configured otherwise in a location block
        root /var/www;
        index index.php index.html index.htm;
        server_name my-domain.net;

        access_log /var/log/nginx/wordpress_access.log;
        error_log /var/log/nginx/wordpress_error.log;

        client_max_body_size 64M;

        location /blog/admin/ {
                try_files $uri $uri/ /blog/admin/index.php?$args;
                root /var/www/wordpress;
                location ~ \.php$ {
                        try_files $uri =404;
                        include /etc/nginx/fastcgi_params;
                        fastcgi_read_timeout 3600s;
                        fastcgi_buffer_size 128k;
                        fastcgi_buffers 4 128k;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                        fastcgi_index index.php;
                }
        }
}

我认为有了这个你至少可以看到你将服务器块root目录设置为你的 WordPress 目录,当请求你的服务器名称(没有路径)时,预期的输出将为 WordPress 目录提供服务。

如果上述配置未修复,我相信提供该目录时的 302 可能是 WordPress 配置的一部分。尝试使用未配置的安装,看看是否至少可以加载,或者如果您有权访问 WordPress 仪表板,请在 WordPress 中设置所需的 URL。

相关内容