![非 root url 下由 nginx 提供的 Wordpress 服务](https://linux22.com/image/779616/%E9%9D%9E%20root%20url%20%E4%B8%8B%E7%94%B1%20nginx%20%E6%8F%90%E4%BE%9B%E7%9A%84%20Wordpress%20%E6%9C%8D%E5%8A%A1.png)
我正在尝试将我的服务器从 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。