Apache Redirect для /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/.htaccess
который совершенно пуст.
У меня также есть .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/<anything else>
они либо оказываются на моей домашней странице (при использовании перенаправления на/
) или бесконечный цикл перенаправления (при использовании перенаправления на/home
).
Что я хочу изменить это:
Когда пользователь заходит на http://example.com/index.php он попадает на мою домашнюю страницу.
Когда пользователь переходит к
http://www.example.com/<anything else>
он переходит на соответствующую страницу (или ошибка 404, если она не существует).
1 ответ
Я не смог найти флаг / переключатель в Apache, который предотвратил перенаправление на существующий запрос, который был ранее перенаправлен.
Вместо этого я обратился к реализации решения в самом приложении.
Например, поскольку мое приложение было приложением Zend Framework 2, мое решение было добавить его в файл /htdocs/public/index.php:
if(trim($_SERVER['REQUEST_URI']) === '/index.php'){
header("Location: /home",TRUE,301);
die();
}
Это не самое чистое из решений. Но я включаю только части ZF2, которые мне нужны, а не весь пакет, поэтому мне не нужно беспокоиться о том, что файл будет перезаписан из-за обновления.