Apache / PHP настроен на обслуживание не того файла - PullRequest
1 голос
/ 12 апреля 2010

У меня есть страница, которая называется как URL http://testserver/path/to/foo/bar/ но apache обслуживает не тот файл вообще.

/path/to/ - это настоящий каталог, в котором находится весь код и файл .htaccess. foo/bar/ предполагается перенаправить на foo_bar.php с RewriteRule, но оно никогда не попадет туда. Это не проблема mod_rewrite, так как я прокомментировал все правила, которые могут мешать, что должно дать мне 404 секунды для этого запроса, но возникает та же проблема:

файл, который обслуживается, является /path/to/foo.php, поэтому в нем я var_dump $_SERVER и получаю:
REQUEST_URI = /path/to/foo/bar/
SCRIPT_NAME = /path/to/foo.php
SCRIPT_FILENAME = /real/path/to/foo.php
PATH_INFO = /bar/
PATH_TRANSLATED = /real/bar/
PHP_SELF = /path/to/foo.php/bar/

Почему этот запрос вообще направляется в этот файл?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2010

У вас установлено mod_negotiation? Если так, то примет ваш запрос и попытается определить, какой файл вы действительно имели в виду. К сожалению, mod_negotiation запутывается магией перенаправления из mod_rewrite, поэтому обязательно отключите опцию mod_negotiation MultiViews при попытке переписать запрос.

Если ваши настройки перезаписи позволяют это, вы можете отключить MultiViews с помощью: Options -MultiViews в вашем файле .htaccess.

0 голосов
/ 12 апреля 2010

Это один из модулей, упомянутых в ответах @ murze's и @ Jacco в сочетании с механизмом PATH_INFO, который используется для «имитации» перезаписи URL в стиле mod_rewrite.

Используя pathinfo, вы можете сделать следующее:

http://testserver/index.php/path/to/foo/bar/1/2/3/

Это вызовет index.php и будет использовать оставшийся фрагмент URL-адреса как PATH_INFO. Это, как я уже сказал, используется для настройки центрального фронт-контроллера с «красивыми» URL-адресами без mod_rewrite.

Теперь в вашем случае происходит то же самое, только что

http://testserver/path/to/foo

переводится - либо через mod_speling, модуль переговоров или третий модуль, имя которого я забыл - в

http://testserver/path/to/foo.php

Остальная часть пути точно передается в этот файл.

Так что это предполагаемое поведение, хотя и странное и неожиданное.

0 голосов
/ 12 апреля 2010

mod_speling может быть виновником. Если он включен на вашем сервере. Попробуйте отключить это. http://httpd.apache.org/docs/1.3/mod/mod_speling.html

...