163 lines
7.1 KiB
Markdown
163 lines
7.1 KiB
Markdown
# Drupal .htaccess Test Structure
|
||
|
||
## Directory Layout Overview
|
||
|
||
```
|
||
/test1/cms/drupal/
|
||
├── core/ - Drupal core directory tests
|
||
│ ├── install.php - Install script (protected by RewriteRule ^core/install\.php)
|
||
│ ├── rebuild.php - Rebuild script (protected by RewriteRule ^core/rebuild\.php)
|
||
│ └── modules/system/tests/ - Tests directory with https/http.php files
|
||
│ ├── https.php - Test HTTPS test file (excluded from routing)
|
||
│ └── http.php - Test HTTP test file (excluded from routing)
|
||
├── favicon.ico - Existing favicon for !-f condition test
|
||
├── index.php - Drupal entry point (routes non-existing files)
|
||
│ - Returns: "Drupal Content Route" page
|
||
├── .htaccess - Hidden .htaccess file (blocked by hidden files rule)
|
||
├── .htpasswd - Hidden .htpasswd file (blocked by hidden files rule)
|
||
├── .well-known/ - Well-known directory (allowed exception)
|
||
│ └── robots.txt - Allowed file via exception (?!well-known)
|
||
├── somedir/ - Directory for testing !-d condition (200 OK)
|
||
├── test-drupal-rewriterules.sh - Bash script to test all rules using curl
|
||
└── README.md - This documentation file
|
||
```
|
||
|
||
## Apache Rules Explained - Drupal
|
||
|
||
### 1. RewriteEngine Activation
|
||
|
||
```apache
|
||
RewriteEngine on
|
||
```
|
||
|
||
**Что делает:** Включает модуль mod_rewrite для этого каталога
|
||
**Зачем нужно:** Без этого все правила rewrite не работают
|
||
|
||
### 2. Protocol Variables (HTTP/HTTPS Detection)
|
||
|
||
```apache
|
||
RewriteRule ^ - [E=protossl]
|
||
RewriteCond %{HTTPS} on
|
||
RewriteRule ^ - [E=protossl:s]
|
||
```
|
||
|
||
**Что делает:** Устанавливает переменную окружения `protossl` = "https" или "http" в зависимости от HTTPS status
|
||
**Зачем нужно:** Drupal использует это для генерации правильных ссылок (http vs https)
|
||
- Если HTTPS off → protossl = "" (пусто, http)
|
||
- Если HTTPS on → protossl = "s"
|
||
|
||
### 3. HTTP Authorization Header Passing
|
||
|
||
```apache
|
||
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
||
```
|
||
|
||
**Что делает:** Копирует Authorization header в переменную HTTP_AUTHORIZATION для PHP
|
||
**Зачем нужно:** Drupal REST API требует эту переменную для аутентификации
|
||
|
||
### 4. Hidden Files/Patterns Protection Rule
|
||
|
||
```apache
|
||
RewriteRule "/\.|^\.(?!well-known/)" - [F]
|
||
```
|
||
|
||
**Что делает:** Блокирует (403 Forbidden) файлы начинающиеся с точки, кроме .well-known/
|
||
- `/\.` - блокирует /filename.хотя бы одна точка в path
|
||
- `^\.(?!well-known/)` - блокирует /隐藏文件, но исключает /well-known/
|
||
|
||
**Зачем нужно:** Защита от доступа к скрытым файлам (.htaccess, .htpasswd, .git)
|
||
**Исключение:** .well-known/robots.txt разрешён (для SEO и security)
|
||
|
||
### 5. Core install/rebuild.php Protection Rules
|
||
|
||
```apache
|
||
RewriteCond %{REQUEST_URI} ^(.*)?/(install\.php) [OR]
|
||
RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild\.php)
|
||
RewriteCond %{REQUEST_URI} !core
|
||
RewriteRule ^ %1/core/%2 [L,QSA,R=301]
|
||
```
|
||
|
||
**Что делает:** Редирект 301 с /install.php → /core/install.php, /rebuild.php → /core/rebuild.php
|
||
**Зачем нужно:** Перемещает install/rebuild скрипты в core directory для безопасности
|
||
|
||
### 6. Core install.php Rewrite
|
||
|
||
```apache
|
||
RewriteRule ^core/install\.php core/install.php?rewrite=ok [QSA,L]
|
||
```
|
||
|
||
**Что делает:** Переписывает запрос на core/install.php с добавлением параметра rewrite=ok
|
||
**Зачем нужно:** Drupal internal handling для процесса установки
|
||
|
||
### 7. Main Drupal Routing Rules (!-f, !-d)
|
||
|
||
```apache
|
||
RewriteCond %{REQUEST_FILENAME} !-f
|
||
RewriteCond %{REQUEST_FILENAME} !-d
|
||
RewriteCond %{REQUEST_URI} !=/favicon.ico
|
||
RewriteRule ^ index.php [L]
|
||
```
|
||
|
||
**Что делает:** Маршрутизирует через index.php все запросы на несуществующие файлы И директории, кроме favicon.ico
|
||
**Зачем нужно:** "Чистые URL" Drupal (похоже на WordPress), routing через index.php
|
||
|
||
### 8. Core Modules Tests Files Exceptions
|
||
|
||
```apache
|
||
RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$
|
||
RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?\.php
|
||
```
|
||
|
||
**Что делает:** Исключает из routing core/*.php и tests/https.php/http.php файлы
|
||
**Зачем нужно:** Эти файлы должны обрабатываться напрямую, не через main index.php
|
||
|
||
## Test Script Features
|
||
|
||
The script includes test functions:
|
||
1. **test_rule()** - checks HTTP status code only
|
||
2. **test_rule_content()** - checks both status AND response body content
|
||
|
||
## Multisite-Specific Testing Scenarios
|
||
|
||
### Hidden Files Protection
|
||
|
||
| URL | Правило | Ожидаемый результат |
|
||
|-----|---------|---------------------|
|
||
| `http://test.my.brp/.htaccess` | hidden files rule `/\.|^\.(?!well-known/)` | 403 Forbidden ✓ |
|
||
| `http://test.my.brp/.htpasswd` | hidden files rule | 403 Forbidden ✓ |
|
||
| `http://test.my.brp/.well-known/robots.txt` | well-known exception | 200 OK (allowed) ✓ |
|
||
|
||
### Core install/rebuild.php Protection
|
||
|
||
| URL | Правило | Ожидаемый результат |
|
||
|-----|---------|---------------------|
|
||
| `http://test.my.brp/install.php` | RewriteRule ^(.*)?/(install\.php) + core exclusion | 301 → /core/install.php ✓ |
|
||
| `http://test.my.brp/rebuild.php` | RewriteRule ^(.*)?/(rebuild\.php) + core exclusion | 301 → /core/rebuild.php ✓ |
|
||
|
||
### Core Files Routing Exceptions
|
||
|
||
| URL | Правило | Ожидаемый результат |
|
||
|-----|---------|---------------------|
|
||
| `http://test.my.brp/core/install.php` | RewriteRule ^core/install\.php ... rewrite=ok parameter | 200 OK ✓ |
|
||
| `http://test.my.brp/core/modules/system/tests/https.php` | tests exception !-https?\.php condition | 200 OK ✓ |
|
||
| `http://test.my.brp/core/modules/system/tests/http.php` | tests exception !-https?\.php condition (s matches empty) | 200 OK ✓ |
|
||
|
||
## Run Tests
|
||
|
||
Execute the test script to verify all rules:
|
||
```bash
|
||
cd /home/alexey/projects/workspace-zed/test1/cms/drupal
|
||
./test-drupal-rewriterules.sh
|
||
```
|
||
|
||
Expected results for Drupal tests (all should be **PASS ✓**):
|
||
- Basic page routing via index.php: HTTP 200 + "Drupal Content Route" ✓
|
||
- Hidden files (.htaccess, .htpasswd) blocked: HTTP 403 ✓
|
||
- .well-known/robots.txt allowed: HTTP 200 ✓
|
||
- install.php redirect to core: HTTP 301 ✓
|
||
- rebuild.php redirect to core: HTTP 301 ✓
|
||
- favicon.ico direct access (!-f): HTTP 200 ✓
|
||
- Non-existing page routing to index.php: HTTP 200 ✓
|
||
- Directory access (!-d): HTTP 200 ✓
|
||
- Tests files https.php/http.php excluded from routing: HTTP 200 ✓
|