153 lines
6.4 KiB
Markdown
153 lines
6.4 KiB
Markdown
|
|
# WordPress Multisite Test Structure - Documentation
|
|||
|
|
|
|||
|
|
## Directory Layout Overview
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
/test1/cms/wordpress-multy/
|
|||
|
|
├── index.php - WordPress entry point (routes non-existing files)
|
|||
|
|
│ - Returns: "WordPress Multisite Content Route" page
|
|||
|
|
├── wp-admin/ - Admin directory tests
|
|||
|
|
│ └── (empty directory for trailing slash redirect test)
|
|||
|
|
├── wp-admin/admin.php - Test file for wp-admin routing rule
|
|||
|
|
├── wp-content/ - WordPress content directory tests
|
|||
|
|
│ └── themes/ - Theme subdirectory
|
|||
|
|
├── wp-includes/ - Core files directory tests
|
|||
|
|
│ └── js/ - JavaScript subdirectory
|
|||
|
|
│ └── (empty for testing)
|
|||
|
|
├── style.css - Existing CSS file (tests RewriteRule !-f condition)
|
|||
|
|
├── script.js - Existing JS file (tests RewriteRule !-f condition)
|
|||
|
|
├── test-wp-multi-rewriterules.sh - Bash script to test all rules using curl
|
|||
|
|
└── README.md - This documentation file
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Apache Rules Explained - WordPress Multisite
|
|||
|
|
|
|||
|
|
### 1. HTTP Authorization Header Passing
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Копирует HTTP Authorization header в переменную HTTP_AUTHORIZATION для PHP
|
|||
|
|
|
|||
|
|
### 2. RewriteBase Configuration
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteBase /
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Устанавливает базовый путь к корню сайта
|
|||
|
|
|
|||
|
|
### 3. Direct index.php Access Protection
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteRule ^index\.php$ - [L]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Предотвращает зацикливание маршрутизации (не переписывает прямой запрос на index.php)
|
|||
|
|
|
|||
|
|
### 4. wp-admin Trailing Slash Redirect
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
# add a trailing slash to /wp-admin
|
|||
|
|
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Добавляет слэш в конце к URL `/wp-admin`, редирект 301 (Moved Permanently)
|
|||
|
|
|
|||
|
|
**Зачем нужно:** WordPress multisite требует trailing slash для admin panel, обеспечивает корректную маршрутизацию
|
|||
|
|
|
|||
|
|
**Подхват поддомена:** `[_0-9a-zA-Z-]+/?` позволяет обработку поддоменов в multisite setup:
|
|||
|
|
- `/wp-admin` → редирект на `/wp-admin/` (301)
|
|||
|
|
- `site.subdomain.com/wp-admin` → редирект на `site.subdomain.com/wp-admin/`
|
|||
|
|
|
|||
|
|
### 5. Existing Files/Directories Check (Skip Processing)
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
|||
|
|
RewriteCond %{REQUEST_FILENAME} -d
|
|||
|
|
RewriteRule ^ - [L]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Если файл ИЛИ директория СУЩЕСТВУЕТ - останавливаем обработку правил, пропускаем запрос напрямую
|
|||
|
|
|
|||
|
|
**Зачем нужно:** Предотвращает маршрутизацию на index.php для существующих статических файлов (CSS, JS, изображения)
|
|||
|
|
|
|||
|
|
### 6. WordPress Multisite Core Routing Rules
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Для multisite setups - маршрутизирует wp-content, wp-admin, wp-includes напрямую (без index.php)
|
|||
|
|
|
|||
|
|
**Подхват поддоменов:** `[_0-9a-zA-Z-]+/?` позволяет обработку поддоменов в multisite:
|
|||
|
|
- `/wp-content/uploads/image.jpg` → прямой доступ к файлу
|
|||
|
|
- `site.subdomain.com/wp-admin/admin.php` → прямая маршрутизация к admin.php
|
|||
|
|
|
|||
|
|
### 7. All PHP Files Direct Access
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Любой PHP файл отдаётся напрямую, без маршрутизации через index.php
|
|||
|
|
|
|||
|
|
**Подхват поддоменов:** `[_0-9a-zA-Z-]+/?` позволяет обработку поддоменов в multisite:
|
|||
|
|
- `/wp-login.php` → прямой доступ к файлу
|
|||
|
|
- `site.subdomain.com/wp-signup.php` → прямая маршрутизация к signup.php
|
|||
|
|
|
|||
|
|
### 8. Final WordPress Routing Rule
|
|||
|
|
|
|||
|
|
```apache
|
|||
|
|
RewriteRule . index.php [L]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что делает:** Все оставшиеся запросы маршрутизируются через index.php (основной URL routing)
|
|||
|
|
|
|||
|
|
## 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
|
|||
|
|
|
|||
|
|
### Subdomain vs Subdirectory Setup
|
|||
|
|
|
|||
|
|
WordPress Multisite может быть configured в двух режимах:
|
|||
|
|
- **Subdomain mode**: sites поддоменами (site1.example.com, site2.example.com)
|
|||
|
|
- **Subdirectory mode**: сайты поддиректориями (/site1/, /site2/)
|
|||
|
|
|
|||
|
|
Правило `[_0-9a-zA-Z-]+/?` обрабатывает оба случая:
|
|||
|
|
- Для subdomain: `[subdomain/]?` = optional prefix
|
|||
|
|
- Для subdirectory: `[directory/]?` = optional prefix
|
|||
|
|
|
|||
|
|
### Test Examples
|
|||
|
|
|
|||
|
|
| URL | Правило | Ожидаемый результат |
|
|||
|
|
|-----|---------|---------------------|
|
|||
|
|
| `http://test.my.brp/wp-admin` | trailing slash redirect | 301 → `/wp-admin/` ✓ |
|
|||
|
|
| `http://test.my.brp/wp-admin/` | direct access (directory exists) | 200 OK ✓ |
|
|||
|
|
| `http://test.my.brp/style.css` | existing file (!-f passes) | 200 OK ✓ |
|
|||
|
|
| `http://test.my.brp/script.js` | existing file (!-f passes) | 200 OK ✓ |
|
|||
|
|
| `http://test.my.brp/wp-admin/admin.php` | multisite wp-admin rule | 200 OK ✓ |
|
|||
|
|
| `http://test.my.brp/wp-content/uploads/test.jpg` | multisite wp-content rule | 200 OK ✓ |
|
|||
|
|
| `http://test.my.brp/nonexistent-page/` | final index.php routing | 200 OK (content from index.php) ✓ |
|
|||
|
|
|
|||
|
|
## Run Tests
|
|||
|
|
|
|||
|
|
Execute the test script to verify all rules:
|
|||
|
|
```bash
|
|||
|
|
cd /home/alexey/projects/workspace-zed/test1/cms/wordpress-multy
|
|||
|
|
./test-wp-multi-rewriterules.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Expected results for WordPress Multisite tests (all should be **PASS ✓**):
|
|||
|
|
- wp-admin trailing slash redirect: HTTP 301 ✓
|
|||
|
|
- wp-admin directory access: HTTP 200 ✓
|
|||
|
|
- Existing file (CSS/JS) access: HTTP 200 ✓
|
|||
|
|
- Existing directory access: HTTP 200 ✓
|
|||
|
|
- WordPress multisite routing (wp-content, admin): HTTP 200 ✓
|
|||
|
|
- Final index.php routing: HTTP 200 + content "WordPress Multisite Content Route" ✓
|