У меня есть a piece of code from another Q&A, что является обобщенным решением форсирования WWW в веб-адресах:
# Force www.
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301]
Мое понимание логики:
Если HTTP_HOST определяется исключительно как "(без строки периода). (без строки периода)", т.е. example.com, а затем захватить остаток и перестроить URL с www, прикрепленным к заголовку HTTP_POST и захваченной строке.
Я разместил этот код в файле .htaccess в своем корневом веб-документе. Внутри этой папки есть несколько подкаталогов, каждый из которых содержит свой собственный .htaccess файл для обработки перенаправлений и чистых URL-адресов, которые являются automatically managed by a CMS. Все записи в этих подкаталогов имеют тенденцию следовать следующей схеме:
RewriteRule ^$ /reason/displayers/generate_page.php?site_id=11111&page_id=222222
RewriteRule ^page$ /subdirectory/page/ [R=permanent]
RewriteRule ^page/$ /reason/displayers/generate_page.php?site_id=111111&page_id=333333
Первая проблема, у меня есть, что RewriteRule
в растворе вызывает только для корневой страницы сайта, а не какой-либо подкаталог или страницы:
- HTTP (s): //example.com ->
HTTP (s): //www.example.com (Хорошо) - HTTP (s): //example.com/subdirectory/ - >
http (s): //example.com/subdirectory/ (Плохо) - HTTP (s): //example.com/subdirectory/page/ ->
HTTP (s): //example.com/subdirectory/page/ (Плохо)
Looking at another Q&A, пользователь предложил добавить RewriteOptions inherit
в подкаталог .htaccess. Делать это с моим первоначальный RewriteRule
в результате одного каталога теста в следующем:
- HTTP (S): //example.com/subdirectory/page/ ->
HTTP (S): //example.com //reason/displayers/generate_page.php/events/?site_id=111111 & page_id содержание = 333333
страница появляется, но URL, конечно, меньше, чем хотелось бы. ОП этого Q & A оставили комментарий, отметив, что им нужно использовать %{REQUEST_URI}
, а не пытаться его захватить и повторно использовать. Пользуясь тем, что для RewriteRule
, я получаю:
- HTTP (S): //example.com/subdirectory/page/ ->
HTTP (S): //www.example.com/subdirectory/page/ ? site_id = 111111 & page_id = 333333
Закрыть, но я, конечно, не хочу параметры появляться там для SEO.
Вопросы
Есть ли способ применения такого рода правило для всех подкаталогов и страниц без необходимости идти и добавить RewriteOptions inherit
строки в каждый подкаталог .htaccess? Учитывая, что они создаются динамически с помощью CMS каждый раз, когда создается сайт, ручное управление включением этой строки не является идеальным.
Предполагая, что есть ли решение для устранения «плохих» URL-адресов, которые я получаю от своей попытки использовать RewriteOptions inherit
, учитывая то, что CMS автоматически помещает в подкаталоги?
Alternative
Это последний, вероятно, за пределами сферы деятельности этого сайта, но, учитывая, что это связано, я включил его в случае, если предыдущий не выполнимо или, если следующее является предпочтительным:
Можно ли обрабатывать этот вид перенаправления с помощью записей VirtualHosts? Насколько я могу судить в моем случае, оба «example.com» и «www.example.com» разрешают один и тот же IP-адрес и корень документа. Если они могут быть разделены, www.example.com может оставаться таким же, как и в случае, если example.com настроен на переход в другое место, что может привести к явному перенаправлению, возможно?
<VirtualHost 111.11.11.111:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/
...
</VirtualHost>
Итак, все, что дается в VirtualHost применяется первым, а затем подкаталог .htaccess, то любой более высокий каталог .htaccess в том случае, если ему сказали через 'RewriteOptions inherit'? –
'RewriteOptions inherit' требуется только для включения' .htaccess' родительского каталога. Правила в VirtualHost будут автоматически применяться на сайте. – anubhava
Наконец, вернемся к этой проблеме. Мне потребовалось некоторое время, чтобы понять это (WHM/cPanel имеет довольно сложную структуру include для virtualhosts). То, что вы предложили, разместив правила перезаписи в объявлении virtualhost, действительно сработало. Большое спасибо. Прежде чем я одобрю ваш ответ, у меня возникает еще один вопрос. Правила перезаписи проверяют отсутствие www и добавляют его независимо от значения HTTP_HOST, потенциально нарушая другие определенные поддомены. Однако, если это помещено в виртуальный хост для (www.) Example.com, предотвращает ли это конфликт, если другие поддомены будут определены в другом месте? –