Added mod_rewrite for nginx module

This commit is contained in:
alexey
2026-03-23 01:15:59 +03:00
commit 0d2c6277e1
124 changed files with 11079 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

View File

@@ -0,0 +1,152 @@
# 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" ✓

View File

@@ -0,0 +1,6 @@
<?php
// WordPress Multisite Test PHP File
// This file is tested via RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
// Any .php file access rule
echo "WordPress Multisite custom script - direct PHP file access";

View File

@@ -0,0 +1,15 @@
<?php
/**
* WordPress Multisite - index.php (Test version)
* This file handles routing for non-existing files/directories in multisite setup
*/
// Simulated WordPress Multisite response
echo "<html><head><title>WordPress Multisite Test Site</title></head><body>";
echo "<h1>WordPress Multisite Content Route</h1>";
echo "<p>This page is served by index.php via RewriteRule.</p>";
echo "<div class='wp-multisite-config'>WordPress Multisite Configuration Loaded</div>";
echo "</body></html>";
// Exit
exit;

View File

@@ -0,0 +1,4 @@
// WordPress Multisite Test JS File
// This file is tested via RewriteCond !-f (existing files skip routing)
console.log('WordPress Multisite CSS/JS test file');

View File

@@ -0,0 +1,8 @@
/* WordPress Multisite Test CSS File */
/* This file is tested via RewriteCond !-f (existing files skip routing) */
body {
font-family: 'Arial', sans-serif;
margin: 0;
padding: 20px;
}

View File

@@ -0,0 +1,171 @@
#!/bin/bash
# ============================================
# WordPress Multisite .htaccess Rules Test Script
# ============================================
# This script tests each rule from cms/wordpress-multy/.htaccess
# Assumption: Site root is mapped to /home/alexey/projects/workspace-zed/test1/cms/wordpress-multy
# Domain: test.my.brp
# ============================================
BASE_URL="http://test.my.brp"
echo "=============================================="
echo "WordPress Multisite .htaccess Rules Test Suite"
echo "=============================================="
echo ""
# Function to test a rule and report result (status only)
test_rule() {
local description="$1"
local url="$2"
local expected_status="$3" # e.g., 403, 404, 200, 301
echo "--- Test: $description ---"
response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
if [ "$response" = "$expected_status" ]; then
echo "✓ PASS (HTTP $response)"
else
echo "✗ FAIL (Expected: HTTP $expected_status, Got: HTTP $response)"
fi
echo ""
}
# Function to test a rule and verify content contains expected string
test_rule_content() {
local description="$1"
local url="$2"
local expected_status="$3" # e.g., 403, 404, 200, 301
local expected_content="$4" # Expected substring in response body
echo "--- Test: $description ---"
response=$(curl -s "$url")
http_code=$(curl -s -o /dev/null -w "%{http_code}" "$url")
# Check status code
if [ "$http_code" != "$expected_status" ]; then
echo "✗ FAIL (Status: HTTP $http_code, Expected: HTTP $expected_status)"
return 1
fi
# Check content contains expected substring
if [[ "$response" == *"$expected_content"* ]]; then
echo "✓ PASS (HTTP $http_code, Content matches '$expected_content')"
else
echo "✗ FAIL (Content missing: '$expected_content') - Response:"
echo "$response" | head -5
fi
echo ""
}
echo "=============================================="
echo "1. HTTP Authorization Header Handling"
echo "=============================================="
# Test that Authorization header is properly handled by WordPress Multisite API
test_rule_content "WordPress multisite handles Authorization header (API request)" \
"$BASE_URL/wp-json/wp/v2/posts?Authorization=Bearer secret_token_123" \
"200" \
"WordPress Multisite Configuration Loaded"
echo ""
echo "=============================================="
echo "2. RewriteBase Root Configuration"
echo "=============================================="
# Test root directory access with proper base path routing
test_rule_content "Root directory access (base path /)" \
"$BASE_URL/" \
"200" \
"WordPress Multisite Content Route"
echo ""
echo "=============================================="
echo "3. Direct index.php Access Protection"
echo "=============================================="
# Test direct access to index.php - should NOT be rewritten (prevents infinite loop)
test_rule_content "Direct index.php access (not rewritten)" \
"$BASE_URL/index.php" \
"200" \
"WordPress Multisite Configuration Loaded"
echo ""
echo "=============================================="
echo "4. wp-admin Trailing Slash Redirect Rule"
echo "=============================================="
# Test trailing slash redirect for /wp-admin (301 Moved Permanently)
test_rule_content "wp-admin trailing slash redirect (301)" \
"$BASE_URL/wp-admin" \
"301"
# Test that /wp-admin/ with trailing slash works correctly (existing directory)
test_rule_content "wp-admin/ with trailing slash (exists as directory)" \
"$BASE_URL/wp-admin/" \
"200" \
"WordPress Multisite Content Route"
echo ""
echo "=============================================="
echo "5. Existing Files/Directories Check Rule"
echo "=============================================="
# Test existing CSS file access (!-f condition passes) - should return 200 OK without routing to index.php
test_rule "Existing CSS file access (style.css)" \
"$BASE_URL/style.css" \
"200"
# Test existing JS file access (!-f condition passes) - should return 200 OK without routing to index.php
test_rule "Existing JS file access (script.js)" \
"$BASE_URL/script.js" \
"200"
echo ""
echo "=============================================="
echo "6. WordPress Multisite Core Routing Rules"
echo "=============================================="
# Test wp-admin specific routing rule (not through index.php)
test_rule_content "wp-admin/admin.php multisite routing" \
"$BASE_URL/wp-admin/admin.php" \
"200" \
"WordPress Multisite Content Route"
# Test wp-content specific routing rule (for uploads, themes etc.)
test_rule_content "wp-content/uploads/test.jpg multisite routing" \
"$BASE_URL/wp-content/uploads/test.jpg" \
"200" \
"WordPress Multisite Content Route"
# Test wp-includes specific routing rule (core files)
test_rule_content "wp-includes/js/jquery.js multisite routing" \
"$BASE_URL/wp-includes/js/jquery.js" \
"200" \
"WordPress Multisite Content Route"
echo ""
echo "=============================================="
echo "7. All PHP Files Direct Access Rule"
echo "=============================================="
# Test any .php file access (not routed through index.php) - custom script returns specific content
test_rule_content "Any PHP file access (.php rule)" \
"$BASE_URL/custom-script.php" \
"200" \
"WordPress Multisite custom script - direct PHP file access"
echo ""
echo "=============================================="
echo "8. Final WordPress Routing Rule"
echo "=============================================="
# Test non-existing file routing through index.php (main routing)
test_rule_content "Non-existing page routing (routes to index.php)" \
"$BASE_URL/nonexistent-page/" \
"200" \
"WordPress Multisite Content Route"
# Test non-existing directory routing through index.php (routes to index.php)
test_rule_content "Non-existing directory routing (routes to index.php)" \
"$BASE_URL/nonexistent-directory/" \
"200" \
"WordPress Multisite Content Route"
echo ""
echo "=============================================="
echo "Test Suite Complete"
echo "=============================================="

View File

@@ -0,0 +1,2 @@
# WordPress Multisite admin.php test file
# This file is tested via RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]

View File

@@ -0,0 +1,2 @@
# WordPress Multisite test.jpg file for wp-content routing rule
# This file is tested via RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]

View File

@@ -0,0 +1,2 @@
# WordPress Multisite jquery.js file for wp-includes routing rule
# This file is tested via RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]