В моей корневой папке следующие записи https://example.org и http://example.org и перенаправляет на соответствующую версию (http или https) с добавленным www. (Это требование, которое они имели с рекламной системой).
Однако проблема заключается в том, что подкаталог использует технику «направлять все в index.php», которую вы видите при кодировании MVC в PHP. Он полностью игнорирует правило www.
Моя проблема в том, что мне нужно, чтобы подкаталоги, даже если у них есть .htaccess, использовали правило корневого .htaccess для перенаправления www. Что я могу сделать, чтобы убедиться, что подкаталог .htaccess применяет правило www от мастера, или, по крайней мере, отредактировать подкаталог .htaccess?
# ROOT .htaccess FILE
RewriteEngine on
# IF HTTPS OFF AND NO WWW, REDIRECT TO HTTP://WWW.*
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,L]
# IF HTTPS ON AND NO WWW, REDIRECT TO HTTPS://WWW.*
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ https://www.example.org/$1 [R=301,L]
Тот, что находится в нескольких подкаталогах, выглядит так:
# SUBDIR .htaccess FILE
Options All +FollowSymLinks -Indexes -Multiviews
# BLOCK ROBOTS AND SPIDERS FROM SCANNING CERTAIN FILES
IndexIgnore .htaccess *~ *.txt *.sql *.xml
# BLOCK SOME COMMON FILE TYPES FROM END USERS
<FilesMatch "\.(sql|xml|txt|htaccess)">
Deny from all
</FilesMatch>
<FilesMatch ".*~$">
Deny from all
</FilesMatch>
RewriteEngine On
# BESIDES BLOCKED FILES ABOVE, OR FILES WE PHYSICALLY HAVE IN THIS DIRECTORY,
# REDIRECT ALL OTHER OUTPUT TO index.php AND PASS ALL URL PARAMETERS IN FULL.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [QSA]
Обратите внимание, что я пробовал что-то подобное в файлах subdir .htaccess, но это не удалось - я получил 404s в путях subdir.
# SUBDIR .htaccess FILE
Options All +FollowSymLinks -Indexes -Multiviews
# BLOCK ROBOTS AND SPIDERS FROM SCANNING CERTAIN FILES
IndexIgnore .htaccess *~ *.txt *.sql *.xml
# BLOCK SOME COMMON FILE TYPES FROM END USERS
<FilesMatch "\.(sql|xml|txt|htaccess)">
Deny from all
</FilesMatch>
<FilesMatch ".*~$">
Deny from all
</FilesMatch>
RewriteEngine On
# IF HTTPS OFF AND NO WWW, REDIRECT TO HTTP://WWW.*
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,L]
# IF HTTPS ON AND NO WWW, REDIRECT TO HTTPS://WWW.*
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ https://www.example.org/$1 [R=301,L]
# BESIDES BLOCKED FILES ABOVE, OR FILES WE PHYSICALLY HAVE IN THIS DIRECTORY,
# REDIRECT ALL OTHER OUTPUT TO index.php AND PASS ALL URL PARAMETERS IN FULL.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [QSA]
РЕДАКТИРОВАТЬ:
Например...
Я хочу пойти в:
1 http://example.org/
2 http://www.example.org/
3 https://example.org/
4 https://www.example.org/
5 http://example.org/test/something.php
6 http://example.org/test/
7 https://www.example.org/test/
8 https://www.example.org/test/update-user
... а тестовая папка является платформой PHP MVC, поэтому внутри этой папки используется метод «направить все на index.php».
... и поэтому я хочу, чтобы приведенное выше было переведено на:
1 http://www.example.org/
2 http://www.example.org/
3 https://www.example.org/
4 https://www.example.org/
5 http://www.example.org/test/something.php
6 http://www.example.org/test/
7 https://www.example.org/test/
8 https://www.example.org/test/update-user
Это стратегия «субдомена www. Независимо от того, какой». И обратите внимание, что он сохранил https без изменений, если он использовался.
Проблема в том, что файл .htaccess тестовой папки игнорирует то, что находится в корневом файле .htaccess, и я не знаю, как отредактировать файл .htaccess тестовой папки, чтобы он мог делать www. вещь правильно. Я попытался это сделать (как я продемонстрировал выше в третьем примере кода) и получил 404 ошибки.
Один из отличных подходов, на который, похоже, ссылается Оливер, - это создать отдельный VHost для не-WWW-сайта и снабдить его глобальным перенаправлением:
<VirtualHost *:80>
ServerName example.org
RedirectPermanent / http://www.example.org/
</VirtualHost>
В противном случае, поскольку вы уже изменяете подчиненного .htaccess
es, просто добавьте это к каждому из подчиненных:
RewriteOptions inherit
Намного чище, чем необходимость поддерживать один и тот же код перезаписи корневого уровня в нескольких .htaccess
es.
Исправить это просто. У меня это почти было в моем примере, который я предоставил в исходном вопросе. Следующий код берет файл .htaccess теста subdir, в котором есть структура PHP MVC, которая использует «направить все в файл index.php», обнаруживает этот «www». префикс не использовался, а добавляет «www». префикс снова включен. Рекламные кампании моего клиента требовали, чтобы "www." добавлен, потому что приобретенная кампания может использовать только один домен, а не два, без дополнительных затрат.
Однако в моем тестировании мне помешали, потому что я забыл о кеше браузера и постоянном перенаправлении 301. Если вы ранее подключались к странице во время экспериментов, вам может потребоваться очистить кеш браузера. Это связано с тем, что во время экспериментов использовалось перенаправление 301, и это указывает браузеру локально кэшировать это перенаправление. Вот почему мои тесты терпели неудачу. Временное перенаправление 302 этого не сделает, но на самом деле в этом случае постоянное перенаправление 301 лучше, потому что оно быстрее во время соединения браузера. Редирект 301 сообщит вашему браузеру (загляните в свой кеш, прежде чем переходить по этому URL-адресу, чтобы знать, куда идти), а перенаправление 302 сообщит вашему браузеру (я решу на лету, куда вы должны перенаправить).
Исправление заключается в добавлении информации о подкаталоге в файл .htaccess. Итак, если у меня есть подкаталог с именем «test» с собственным файлом .htaccess внутри, мне нужно добавить эту информацию. Обратите внимание, что / test / добавлен ниже. И если бы у меня был этот файл внутри / test / test2, мне нужно было бы добавить / test / test2 / в этот файл .htaccess. Возьми?
# SUBDIR .htaccess FILE
Options All +FollowSymLinks -Indexes -Multiviews
# BLOCK ROBOTS AND SPIDERS FROM SCANNING CERTAIN FILES
IndexIgnore .htaccess *~ *.txt *.sql *.xml
# BLOCK SOME COMMON FILE TYPES FROM END USERS
<FilesMatch "\.(sql|xml|txt|htaccess)">
Deny from all
</FilesMatch>
<FilesMatch ".*~$">
Deny from all
</FilesMatch>
RewriteEngine On
# IF HTTPS OFF AND NO WWW, REDIRECT TO HTTP://WWW.*
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ http://www.example.org/test/$1 [R=301,L]
# IF HTTPS ON AND NO WWW, REDIRECT TO HTTPS://WWW.*
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ https://www.example.org/test/$1 [R=301,L]
# BESIDES BLOCKED FILES ABOVE, OR FILES WE PHYSICALLY HAVE IN THIS DIRECTORY,
# REDIRECT ALL OTHER OUTPUT TO index.php AND PASS ALL URL PARAMETERS IN FULL.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [QSA]
Простым решением было бы создать отдельную корневую папку для сайта example.org.