Назад | Перейти на главную страницу

.htaccess перенаправляет все домены с путями на один

У меня есть три домена, все указывающие на одно и то же пространство хостинга, отраженные с помощью A записи:

У меня сайт в корне (/) и установку MediaWiki на example.org/members/wiki. Я бы хотел, чтобы все запросы перенаправлялись на HTTPS и на .org домен.

Я справился с этим с помощью веб-сайта, используя .htaccess в корне:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !example.org$ [NC]
RewriteRule (.*) https://www.example.org/$1 [R=301,L]

но я не могу заставить его работать с вики - запросы к .org.uk или .co.uk домены не перенаправляются.

у меня есть это .htaccess в /members:

Options -Indexes
RewriteEngine On
RewriteRule ^example.org.uk(/.*)?$     https://www.example.org/$1
RewriteRule ^example.co.uk(/.*)?$ https://www.example.org/$1 

# MediaWiki pretty URL rewrites
RewriteRule ^/?members/wiki(/.*)?$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]

Я хочу, например, example.co.uk/members/wiki/My_Page беспрепятственно перенаправить на https://www.example.org/members/wiki/My_Page.

Кто-нибудь может сказать мне, что случилось?

Ваша проблема в том, что директивы mod_rewrite по умолчанию не наследуются. Директивы mod_rewrite в вашем /members/.htaccess файл полностью перекрывает директивы mod_rewrite в родительском .htaccess файл. Директивы mod_rewrite в родительском .htaccess файл не выполняется при доступе к вашей вики.

Вы можете включить наследование mod_rewrite из /members/.htaccess файл (используя RewriteOptions Inherit), однако текущие директивы в родительском .htaccess file по-прежнему не будут работать, если они унаследованы. (Директивы наследуются, как будто они буквально копируются в подкаталоги .htaccess файл.)

Чтобы использовать наследование mod_rewrite, вам нужно изменить следующие директивы в родительском .htaccess файл:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !example.org$ [NC]
RewriteRule (.*) https://www.example.org/$1 [R=301,L]

читать:

RewriteEngine On
RewriteCond %{HTTP_HOST} !example\.org$
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]

В RewriteBase директива здесь излишняя. (Если у вас нет других директив?) REQUEST_URI серверная переменная содержит полный URL-путь, независимо от того, где он используется, в отличие от захваченного URL-пути из RewriteRule шаблон в котором, в частности, удален префикс каталога в каталоге /.htaccess контекст. В NC флаг также должен быть удален на этом отрицательный CondPattern, поскольку вы также хотите перенаправлять искаженные запросы.

В стороне: Однако это по-прежнему не канонизирует субдомен www и не перенаправляет запросы, отличные от HTTPS, на example.org - это требование? Для этого вам понадобится что-то вроде следующего:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^example\.org$ [OR]
RewriteCond %{HTTPS} !on
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]

Обратите внимание на начало привязки строки (^) на CondPattern (!^example\.org$). И дополнительная проверка по HTTPS серверная переменная (которая определяется оператором ИЛИ).

А потом в /members/.htaccess, вы заменяете первую часть (которая все равно никогда не сработает, поскольку RewriteRule шаблон соответствует только URL-пути, а не имени хоста):

Options -Indexes
RewriteEngine On
RewriteRule ^example.org.uk(/.*)?$     https://www.example.org/$1
RewriteRule ^example.co.uk(/.*)?$ https://www.example.org/$1 

Со следующим:

Options -Indexes
RewriteEngine On
RewriteOptions Inherit

В качестве альтернативы вы можете забыть о наследовании и просто скопировать родительские директивы mod_rewrite в папку /members/.htaccess файл:

Options -Indexes
RewriteEngine On
RewriteCond %{HTTP_HOST} !example\.org$
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]

# MediaWiki pretty URL rewrites
RewriteRule ^/?members/wiki(/.*)?$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]

В стороне: Однако эти директивы не будут работать в /members/.htaccess файл тоже ?! Эти директивы предназначены для контекста конфигурации сервера (или VirtualHost).

В каталоге .htaccess файлы, RewriteRule шаблон совпадает с URL-путем меньше префикса каталога. Итак, паттерн, который начинается ^/?members/ никогда не будет совпадать, когда .htaccess сам файл находится в /members подкаталог. (Однако это будет работать в контексте сервера / VirtualHost, поскольку шаблон совпадает с полным URL-путем.)

Также в каждом каталоге .htaccess файлы, которые нельзя переписать в абсолютный путь к файловой системе, это должен быть URL-путь относительно корня документа. (Однако вы можете сделать это в контексте сервера / VirtualHost.)

Также, %{DOCUMENT_ROOT}%{REQUEST_URI} более типичен для директивы, используемой в конфигурации сервера. Проще просто использовать %{REQUEST_FILENAME} в .htaccess.

Чтобы это работало в /members/.htaccess вам нужно будет изменить эти директивы, чтобы читать что-то вроде следующего:

# MediaWiki pretty URL rewrites
RewriteRule ^wiki(/.*)?$ wiki/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ wiki/index.php [L]