明白了,这种目录结构是 Drupal 10 使用 Composer 安装的标准结构。在这种情况下,我们需要做两件事:
1. **修改 `root` 路径**:将网站根目录指向 `dwoke/web`。
2. **(推荐)配置子目录访问**:通常为了让 URL 更美观且安全,我们会配置让 `http://127.0.0.1:8080/` 直接访问 `dwoke` 文件夹下的内容,而不是让 URL 变成 `http://127.0.0.1:8080/dwoke/web/`。
假设你的物理路径是 `/var/www/html/dwoke/web/index.php`,下面是针对这种情况的最佳 Nginx 配置:
### Drupal 10 子目录结构专用配置
```nginx
server {
listen 8080 default_server;
listen [::]:8080 default_server;
# --- 核心修改 1: 指向 Drupal 的 web 目录 ---
# 假设你的 dwoke 文件夹在 /var/www/html/ 下
# 最终路径组合就是: /var/www/html/dwoke/web
root /var/www/html/dwoke/web;
index index.php index.html;
server_name _;
# --- 核心修改 2: Drupal 的 URL 重写规则 ---
location / {
# try_files 会尝试查找文件,如果找不到,则转交给 index.php
# 这解决了你之前 "干净 URL 404" 的问题
try_files $uri $uri/ /index.php?$query_string;
}
# --- Drupal 私有文件保护 ---
# 如果 drupal 根目录是 root,那么这里写相对路径即可
location ~ ^/sites/.*/private/ {
deny all;
return 404;
}
# --- 禁止访问敏感文件 (备份、隐藏文件等) ---
location ~* \.(bak|config|sql|tar|tgz|zip|sh|engine|inc|info|install|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl|svn-base)$ {
deny all;
}
location ~ /\. {
deny all;
}
# --- PHP 处理核心配置 ---
location ~ '\.php$|^/update.php' {
include snippets/fastcgi-php.conf;
# 对应你的 PHP 8.4 版本
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
# 这里的 $document_root 会自动替换为上面定义的 root 路径
# 即: /var/www/html/dwoke/web
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 优化参数
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
# --- 静态资源缓存 ---
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires max;
log_not_found off;
}
}
```
### 关键修改说明
1. **`root /var/www/html/dwoke/web;`**
* 这是最重要的一行。它告诉 Nginx:“网站的根目录就是 `dwoke/web`”。
* 这样,当用户访问 `http://127.0.0.1:8080/index.php` 时,Nginx 实际上是在读取 `/var/www/html/dwoke/web/index.php`。
* **注意**:请确保 `dwoke` 文件夹有足够的权限让 Nginx 读取(通常 Nginx 运行用户是 `www-data`)。
* 可以运行命令授权:`sudo chown -R www-data:www-data /var/www/html/dwoke`
2. **`try_files $uri $uri/ /index.php?$query_string;`**
* 这行代码依然必不可少。因为 Drupal 的 URL(如 `/node/1` 或你的文章别名)在 `web` 目录下并不存在真实的物理文件。这行指令充当了“路由器”,把找不到的文件请求全部转交给 `index.php` 处理。
### 验证步骤
配置修改完成后,请执行以下步骤:
1. **检查权限(非常重要)**:
如果 `dwoke` 目录是新建的,或者归属权不是 web 服务器用户,可能会导致 Permission Denied。
```bash
# 将 your_username 替换为你的用户名,这通常能解决权限问题
sudo chown -R www-data:www-data /var/www/html/dwoke
sudo chmod -R 775 /var/www/html/dwoke
```
2. **测试配置语法**:
```bash
sudo nginx -t
```
3. **重载 Nginx**:
```bash
sudo systemctl reload nginx
```
现在,访问 `http://127.0.0.1:8080/` 应该就能直接进入 Drupal 10 的首页,并且所有干净的 URL(如你之前的 `articles/...`)都能正常工作了。
评论