Сайт доступен с несколькими URL - PullRequest
0 голосов
/ 22 октября 2018

Я использую микро-фреймворк Silex на своем веб-сайте, размещенном на VPS.

Итак, файлы сайта находятся в папке /site_name/public_html/, но в Silex сайт должен указывать на /site_name/public_html/web/ folder.

В каталоге public_html у меня есть следующий файл .htaccess:

Options -Indexes -MultiViews

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Redirect to https & www
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L,NE]

    # Redirect incoming URLs to web folder
    RewriteCond %{REQUEST_URI} !web/
    RewriteRule (.*) /web/$1 [L]
</IfModule>

И в папке /public_html/web/ следующий .htaccess:

<IfModule mod_rewrite.c>
    # Redirect incoming URLs to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>

Теперь все работает нормально, но мои страницы доступны с тремя различными шаблонами:

  1. example.com/page/ (тот, который я хочу сохранить)
  2. example.com/web/page/
  3. example.com/web/index.php/page/

Я использовал метаканоническое, чтобы избежать дублирования контента, но я все еще хочу, чтобы эти два последних варианта не существовали.

Я предполагаюМне нужно что-то изменить в обоих .htaccess файлах, но я не могу найти, что это такое.

1 Ответ

0 голосов
/ 23 октября 2018

Я бы вообще удалил файл .htaccess в подкаталоге /web и переписал бы прямо в /web/index.php в корневом .htaccess файле.Имея два .htaccess файла, вы создаете дополнительную работу.Директивы mod_rewrite в подкаталоге будут полностью переопределять родительские директивы (по умолчанию), поэтому ваши канонические перенаправления HTTPS и www также переопределяются.

(Предположительно, у вас была директива RewriteEngine On в файле /web/.htaccess?)

Удалив файл /web/.htaccess, попробуйте что-то вроде следующего в своем корневом .htaccess файле:

Options -Indexes -MultiViews

RewriteEngine On
RewriteBase /web

# Redirect to https & www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=302,L,NE]

# If /web or /index.php is present at the start of the requested URL then remove it (via redirect)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(?:web|index\.php)/(.*) /$1 [R=302,L]

# Front-controller...
# Internally rewrite all requests to /web/index.php (uses RewriteBase set above)
RewriteRule index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

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

Оболочка <IfModule> не требуется, если только ваш сайт не предназначен для работы без mod_rewrite.

Обратите внимание, что запрос похож на /web/index.php/page/ приведет к двум перенаправлениям.Сначала /index.php/page, затем /page.Поскольку это крайний случай, я бы посчитал приемлемым двойное перенаправление.

ОБНОВЛЕНИЕ: Я удалил проверку "directory" в приведенном выше примере, так как это предотвратило бы корень документа(example.com/) от перезаписи в подкаталог /web.Следовательно, это привело бы к 403, если бы у вас не было индексного документа каталога (например, index.php) в корне документа вашего сайта.(Тем не менее, запросы на example.com/page/ должны все еще работать нормально.)

Тестировать с 302 (временными) перенаправлениями и менять только на 301 (постоянные), когда вы уверены, что он работает нормально - чтобы избежать проблем с кэшированием вбраузер.Обязательно очистите кеш браузера перед тестированием.

...