Избегайте дублирования URL-адресов с помощью директивы Apache FallbackResource

Я использую директиву FallbackResource для маршрутизации всех веб-запросов через фронт-контроллер /index.php:

FallbackResource /index.php

Это отлично работает, но меня беспокоит одно. Дело в том, что /index.php по-прежнему доступен напрямую - у того же ресурса есть два URL-адреса:

  • http://www.example.com/resource-path
  • http://www.example.com/ индекс. php / resource-path

Я надеялся, что FallbackResource справится с этим, так что будет доступен только основной URL, поскольку это может создать проблемы с поисковой оптимизацией. Как лучше всего это исправить?

3
задан 28 November 2018 в 10:34
1 ответ

Я не нашел решения в Apache для этого. Единственное решение, которое я нашел для этого, - это обработка его в PHP, что почти сводит на нет цель использования FallbackResource /index.php в первую очередь.

if (preg_match('#^/index.php#', $_SERVER['REQUEST_URI'])) {
    $redirect = preg_replace('#^/index.php#', '', $_SERVER['REQUEST_URI']);
    if (empty($redirect)) {
        $redirect = '/'; // in case request is domain.com/index.php with no trailing slash
    }
    header('Location: ' . $redirect);
    exit;
}

Это не идеально, но работает. Странно, что так мало информации о проблеме с дублированием URL-адресов с FallbackResource . Тем не менее, IMO этого решения было недостаточно, поэтому я лично вернулся к mod_rewrite .

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^ %{ENV:BASE}/index.php [L]

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

2
ответ дан 3 December 2019 в 06:54

Теги

Похожие вопросы