Added mod_rewrite for nginx module
This commit is contained in:
14
cms/wordpress-multy/.htaccess
Normal file
14
cms/wordpress-multy/.htaccess
Normal 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]
|
||||
152
cms/wordpress-multy/README.md
Normal file
152
cms/wordpress-multy/README.md
Normal 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" ✓
|
||||
6
cms/wordpress-multy/custom-script.php
Normal file
6
cms/wordpress-multy/custom-script.php
Normal 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";
|
||||
15
cms/wordpress-multy/index.php
Normal file
15
cms/wordpress-multy/index.php
Normal 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;
|
||||
4
cms/wordpress-multy/script.js
Normal file
4
cms/wordpress-multy/script.js
Normal 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');
|
||||
8
cms/wordpress-multy/style.css
Normal file
8
cms/wordpress-multy/style.css
Normal 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;
|
||||
}
|
||||
171
cms/wordpress-multy/test-wp-multi-rewriterules.sh
Executable file
171
cms/wordpress-multy/test-wp-multi-rewriterules.sh
Executable 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 "=============================================="
|
||||
2
cms/wordpress-multy/wp-admin/admin.php
Normal file
2
cms/wordpress-multy/wp-admin/admin.php
Normal 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]
|
||||
0
cms/wordpress-multy/wp-content/themes/.gitkeep
Normal file
0
cms/wordpress-multy/wp-content/themes/.gitkeep
Normal file
2
cms/wordpress-multy/wp-content/uploads/test.jpg
Normal file
2
cms/wordpress-multy/wp-content/uploads/test.jpg
Normal 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]
|
||||
2
cms/wordpress-multy/wp-includes/js/jquery.js
vendored
Normal file
2
cms/wordpress-multy/wp-includes/js/jquery.js
vendored
Normal 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]
|
||||
Reference in New Issue
Block a user