2016-01-08 2 views
1

Проблема.htaccess - принудительное правило из файла root .htaccess, несмотря на то, что каждый подкаталог имеет собственный файл?

У меня есть 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> 

ответ

1

Да, действительно, чтобы применить правило ко всем подкаталогам вставить это правило в <VirtualHost..> разделе:

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

Итак, все, что дается в VirtualHost применяется первым, а затем подкаталог .htaccess, то любой более высокий каталог .htaccess в том случае, если ему сказали через 'RewriteOptions inherit'? –

+0

'RewriteOptions inherit' требуется только для включения' .htaccess' родительского каталога. Правила в VirtualHost будут автоматически применяться на сайте. – anubhava

+0

Наконец, вернемся к этой проблеме. Мне потребовалось некоторое время, чтобы понять это (WHM/cPanel имеет довольно сложную структуру include для virtualhosts). То, что вы предложили, разместив правила перезаписи в объявлении virtualhost, действительно сработало. Большое спасибо. Прежде чем я одобрю ваш ответ, у меня возникает еще один вопрос. Правила перезаписи проверяют отсутствие www и добавляют его независимо от значения HTTP_HOST, потенциально нарушая другие определенные поддомены. Однако, если это помещено в виртуальный хост для (www.) Example.com, предотвращает ли это конфликт, если другие поддомены будут определены в другом месте? –