Надеюсь, кто-то может помочь мне определить, где моя проблема. У меня есть целая PHP-архитектура приложения, которая объединилась. Он работал отлично, пока я не попытался создать карту URI (аналогично тому, как работает Slim Framework). Вот пример кода (хотя использование другой архитектуры, аналогичной CodeIgniter, которую я построил в прошлые годы, имеет такую же проблему):
class Err extends Base_Director {
function __construct() {
/* THIS WORKS EITHER WAY! */
$this->get('/', function(){
echo 'Error.';
});
/* THIS WORKS VIA '/err/404' BUT NOT WHEN CLASS IS 'error' ('/error/404') */
$this->get('/404', function(){
echo 'Numeric Error 404.';
});
/* THIS WORK VIA '/err/four' BUT NOT WHEN CLASS IS 'error' ('/error/four') */
$this->get('/four', function(){
echo 'Alphanumeric Error.';
});
$this->submit();
}
}
Я действительно думаю, что это проблема с Apache, но Googling и поиск StackOverflow не активировали ничего, что работает. Кажется, что любой URL-адрес с использованием переменной $ _GET (с '/error/*') возвращает Apache "Object not found!" стр. Содержание на странице:
Запрошенный URL-адрес не найден на этом сервере. Если вы указали URL вручную, проверьте правильность написания и повторите попытку.
Однако каждое другое значение URL-адреса отлично работает.
В прошлый раз, когда я попытался решить эти неудобства, я подумал, что это может быть зарезервированное ключевое слово или что-то в Apache, но я никогда не прорывал файлы веб-сервера, опасаясь, что я могу что-то испортить. Если есть какой-то код, который, по вашему мнению, я должен включить, сообщите мне. Вот мой .htaccess
который я использую кстати:
DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_URI} !^(index\.php|\.swf|forums|images|css|downloads|js|robots\.txt|favicon\.ico)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ ./index.php?url=$1 [NC,QSA,L]
Обновление: я рассмотрел проблему больше, чтобы помочь ее сузить. "example.com/error/404" возвращает "Объект не найден!". как я уже говорил выше, и все же "example.com/Error/404" проходит через штраф.
Обновление 2: Вот моя конфигурация httpd:
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks Includes ExecCGI
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All
Order allow,deny
Allow from all
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
Не хотел наводнять это сообщение, поэтому можно найти остальную часть моего файла httpd на PasteBin
Замените все, что вы написали этим, он сделает то же самое и может исправить вашу проблему:
DirectoryIndex index.php
RewriteEngine On
RewriteRule /error/(.*) /err/$1 [L,R=301]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /index.php?url=$1 [L]
EDIT by Trevor: Я получил вышеописанную работу после редактирования httpd-multilang-errordoc.conf
и комментирования Alias/error/"C: /xampp/apache/error/"
. Можно также просто изменить перенаправление ошибок через псевдоним. Это похоже на функцию Xampp, и мое дополнение к решению может не работать с другими "пакетами" сервера.
print_r($_GET)
и предоставленного вами файла .htaccess, и столкнулись с той же проблемой.
LogLevel debug rewrite:trace8
для журналов перезаписи, чтобы увидеть, являются ли правила takeb и почему они не совпадают, и больше журналов в вашем httpd.conf вместо строки LogLevel warn