У меня странная проблема. Я использую фреймворк, который вызывается после того, как mod_rewrite перезаписывает URL. Если символ в URI подчеркнут, как в латинском алфавите, запрос никогда не отправляется в мою структуру, а скорее сервер выдает ошибку с кодом 404. Я использую машину Windows, поэтому не уверен, есть ли у нее что-то при чем тут это или нет. Пока в URI НЕТ символов с диакритическими знаками, запрос отправляется в платформу без каких-либо проблем. Подскажите, пожалуйста, что здесь происходит и как это решить?
РЕДАКТИРОВАТЬ: Вот 2 строки из моего журнала access.log. Первая строка показывает 404, где Å
был закодирован Apache и не был передан. Когда я меняю Å
в URI на английскую букву «А» все работает как положено.
127.0.0.1 - - [20/Oct/2017:13:50:50 -0400] "GET /actor/%C3%85ker HTTP/1.1" 404 222
127.0.0.1 - - [20/Oct/2017:13:54:48 -0400] "GET /actor/Aker HTTP/1.1" 200 5701
РЕДАКТИРОВАТЬ: Это строки в .htaccess
файл
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?request=$1 [L,QSA]
Это часть журнала отладки, состоящего из двух человек, который показывает, что для одного из них mod_rewrite не пересылает запрос в мою структуру, а другой -.
Это тот, который терпит неудачу:
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] add path info postfix: C:/Development/Apache24/htdocs/ansac/actor -> C:/Development/Apache24/htdocs/ansac/actor/\xc3\x85kerman, referer: http://ansac.com/
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] strip per-dir prefix: C:/Development/Apache24/htdocs/ansac/actor/\xc3\x85kerman -> actor/\xc3\x85kerman, referer: http://ansac.com/
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] applying pattern '^(.*)$' to uri 'actor/\xc3\x85kerman', referer: http://ansac.com/
[Fri Oct 20 17:52:48.119655 2017] [rewrite:trace1] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52846] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1fec230/initial] [perdir C:/Development/Apache24/htdocs/ansac/] pass through C:/Development/Apache24/htdocs/ansac/actor, referer: http://ansac.com/
Как ни странно, работает этот:
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] add path info postfix: C:/Development/Apache24/htdocs/ansac/actor -> C:/Development/Apache24/htdocs/ansac/actor/Gonz\xc3\xa1lez
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] strip per-dir prefix: C:/Development/Apache24/htdocs/ansac/actor/Gonz\xc3\xa1lez -> actor/Gonz\xc3\xa1lez
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] applying pattern '^(.*)$' to uri 'actor/Gonz\xc3\xa1lez'
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace4] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] RewriteCond: input='C:/Development/Apache24/htdocs/ansac/actor' pattern='!-f' => matched
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace4] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] RewriteCond: input='C:/Development/Apache24/htdocs/ansac/actor' pattern='!-d' => matched
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace2] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] rewrite 'actor/Gonz\xc3\xa1lez' -> 'index.php?do=actor/Gonz\xc3\xa1lez'
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] split uri=index.php?do=actor/Gonz\xc3\xa1lez -> uri=index.php, args=do=actor/Gonz\xc3\xa1lez
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] add per-dir prefix: index.php -> C:/Development/Apache24/htdocs/ansac/index.php
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace2] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] strip document_root prefix: C:/Development/Apache24/htdocs/ansac/index.php -> /index.php
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace1] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ff8290/initial] [perdir C:/Development/Apache24/htdocs/ansac/] internal redirect with /index.php [INTERNAL REDIRECT]
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] strip per-dir prefix: C:/Development/Apache24/htdocs/ansac/index.php -> index.php
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace3] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] applying pattern '^(.*)$' to uri 'index.php'
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace4] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] RewriteCond: input='C:/Development/Apache24/htdocs/ansac/index.php' pattern='!-f' => not-matched
[Fri Oct 20 17:56:42.415807 2017] [rewrite:trace1] [pid 1620:tid 792] mod_rewrite.c(480): [client 127.0.0.1:52856] 127.0.0.1 - - [ansac.com/sid#2de668][rid#1ffd7c0/initial/redir#1] [perdir C:/Development/Apache24/htdocs/ansac/] pass through C:/Development/Apache24/htdocs/ansac/index.php
Почему один работает, а другой нет? В обоих именах есть акценты, но одно не удается.
Гипотеза ...
RewriteRule .* index.php?request=$1 [L,QSA]
Эта линия выглядит как ошибка, так как $1
обратная ссылка будет всегда быть пустым, так как в RewriteRule
шаблон.
«Фреймворк» все еще может работать (для латинского алфавита), потому что он может анализировать $_SERVER['REQUEST_URI']
Вместо этого PHP суперглобальный (возможно, как запасной вариант) - что и делают многие фреймворки. Тем не мение, $_SERVER['REQUEST_URI']
останется в кодировке URL (например, /actor/%C3%85ker
) - так что это, вероятно, нужно декодировать URL (например, /actor/Åker
), прежде чем его можно будет маршрутизировать через вашу структуру. Возможно, здесь проблема. Запрос вроде /actor/Aker
, с другой стороны, одинаково вне зависимости от того, закодирован он URL-адресом или нет, поэтому это не повлияет на такие URL-адреса.
Однако, если ваша структура позволяет переопределить запрошенный URL с помощью request
Затем рассмотрите возможность изменения указанной выше директивы в параметре URL на:
RewriteRule (.*) index.php?request=$1 [L,QSA]
т.е. приложить RewriteRule
шаблон в скобках.
Это приведет к тому, что захваченный URL-путь будет передан в request
Параметр URL. Важное отличие состоит в том, что URL-путь, RewriteRule
Директива соответствует уже декодированному URL. Так что request
Параметр URL уже содержит URL-декодированный запрос (хотя и без префикса косой черты), например. actor/Åker
.
ОБНОВИТЬ: Попробуйте изменить RewriteRule
шаблон из .*
к [\s\S]*
вместо. Например:
RewriteRule ([\s\S]*) index.php?request=$1 [QSA,L]
Это просто немного более всеобъемлющий образец. Пока .
(точка) соответствует любому символу (исключая символы новой строки), [\s\S]
соответствует любому пробелу и любым непробельным символам (т.е. все).
Загляните в свои журналы. Каков путь к файлу, который, по словам журнала ошибок Apache, он ищет? Этот путь к этому файлу существует?
Похоже на проблему с кодировкой символов. Убедитесь, что в Apache правильно настроена кодировка символов. К сожалению, у меня нет конкретных рекомендаций по этому поводу.