Apache Redirect to / index.php - Как обрабатывать прямые запросы для /index.php

Я не уверен на 100%, должно ли это быть из-за сбоя сервера или переполнения стека, хотя я склоняюсь к ошибке сервера.

Большинство фреймворков PHP используют перенаправления Apache для направления всех запросов в / index. php , а затем фреймворк обрабатывает маршрутизацию оттуда. Проблема, с которой я столкнулся, заключается в том, что наш старый сайт не использовал эту методологию и /index.php действительно был нашей домашней страницей. Теперь, когда мы выпустили новый сайт, мы хотим перенаправить все прямые запросы с /index.php на / home .

Мне кажется, я помню, что в Apache был переключатель или что-то в этом роде, которое выполняет перенаправление только в том случае, если текущий запрос не является результатом другого перенаправления 301. Хотя я не могу найти ничего подобного. Я это выдумываю? Если да, есть ли способ справиться с этой ситуацией?

Я вырезал из моего файла конфигурации Apache до минимума, чтобы исключить вероятность неизвестных перенаправлений. Вот он (хотя доменное имя было отредактировано):

##
# Some LoadModule includes
##

## Set the IP and ports for this server
Listen 10.0.15.246:80

## zend fastcgi
AddType application/x-httpd-php .php
AddHandler fastcgi-script .php

<VirtualHost *:80>

    ## Set various vhost values
    ServerName www.example.com
    DocumentRoot /www/www.example.com/htdocs/public
    DirectoryIndex index.php

    ##Set development environment
    SetEnv WEB_ROOT /www/www.example.com/htdocs/public
    SetEnv APPLICATION_ENV development

    RewriteEngine On

    ## My attempts to redirect /index.php to either / or /home
    #RewriteRule /index.php$ /home [R=301,NC,L]
    #RewriteRule /index.php$ / [R=301,NC,L]

    <Directory /www/www.example.com/htdocs/public>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all

    </Directory>

</VirtualHost>

У меня . У меня также есть файл .htaccess , расположенный по адресу /htdocs/public/.htaccess , который содержит следующее и ничего больше:

RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size
# fits all solution.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

Что происходит в настоящее время:

  • Когда пользователь переходит на http://www.example.com/index.php они получение ошибки 404.
  • Когда пользователь переходит на http://www.example.com или даже http://www.example.com/home они попадают на мою домашнюю страницу.
  • Когда пользователь переходит на http://www.example.com/ <что-нибудь еще> , они либо попадают на мою домашнюю страницу (при использовании перенаправления на / ) или бесконечный цикл перенаправления (при использовании перенаправления на / home ).

Я хочу изменить следующее:

  • Когда пользователь переходит на http://example.com/ index.php они попадают на мою домашнюю страницу.

  • Когда пользователь переходит на http://www.example.com/ <что-нибудь еще> , он переходит на соответствующую страницу (или 404, если он не существует).

1
задан 9 August 2018 в 18:40
1 ответ

Мне не удалось найти флаг / переключатель в Apache, который предотвращал перенаправление существующего запроса, который был перенаправлен ранее.

Вместо этого я решил реализовать решение внутри самого приложения.

Например, поскольку мое приложение было приложением Zend Framework 2, мое решение добавляло это в файл /htdocs/public/index.php:

if(trim($_SERVER['REQUEST_URI']) === '/index.php'){
    header("Location: /home",TRUE,301);
    die();
}

Это не самое чистое решение. Но я включаю только те части ZF2, которые мне нужны, а не весь пакет, поэтому мне не нужно беспокоиться о перезаписи файла из-за обновления.

0
ответ дан 4 December 2019 в 03:45

Теги

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