У меня есть три домена, все указывающие на одно и то же пространство хостинга, отраженные с помощью A
записи:
example.org
example.org.uk
example.co.uk
У меня сайт в корне (/
) и установку 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]