3

На сайте Zend Framework 2 на основе (тестовой среды на Nginx и живой среды на Apache) есть категория «курсы» и его страницы имеют идентификаторы URI, как это:Как заменить специальный символ в URI запроса HTTP?

domain.tld/courses/123-Name of course that can contain ®, €, (,), and other special chars 

Курсов имена взяты из базы данных и является URL-закодированы для внутренних ссылок:

domain.tld/courses/123-Name%20of%20course%20that%20can%20contain%20%C2%AE%2C%20%E2%82%AC%2C%20%C3%A4%2C%20(%2C%20)%2C%20and%20other%20special%20chars 

Это работает отлично, но когда я пытаюсь получить доступ к странице с помощью специального символа, не кодирующие 404-встретилась ошибка.

Примером сайта, использующего пространственные символы, является Википедия. Вы можете использовать

http://en.wikipedia.org/wiki/Signal_(electrical_engineering) 

или

http://en.wikipedia.org/wiki/Signal_%28electrical_engineering%29 

и всегда получают страницу, которую вы хотите.

Кто-нибудь знает, как добиться такого поведения («а-ля-Википедия»)? (Может быть, с HTTP перенаправления с .htaccess правило?)


UPDATE:

/и т.д./Nginx/топор общего ВХост

server { 
    listen 80; 
    server_name 
     foo.loc 
     bar.loc 
     baz.loc 
    ; 

    if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) { 
     set $folder "$area/$project"; 
    } 

    access_log /var/log/nginx/$area/$project.access.log; 
    error_log /var/log/nginx/error.log; 

    gzip on; 
    gzip_min_length 1000; 
    gzip_types text/plain text/xml application/xml; 

    client_max_body_size 25m; 

    root /var/www/$folder/public/; 

    try_files $uri $uri/ /index.php?$args; 
    index index.html index.php; 

    location/{ 
     index index.html index.php; 
    sendfile off; 
    } 

    location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ { 
     deny all; 
    } 

    location ~ \.htaccess { 
     deny all; 
    } 

    if (!-e $request_filename) { 
     rewrite ^.*$ /index.php last; 
    } 

    location ~ \.php$ { 
     fastcgi_cache  off; 
     #fastcgi_pass  127.0.0.1:9001; 
     fastcgi_pass   unix:/var/run/php5-fpm.sock; 
     fastcgi_read_timeout 6000; 
     fastcgi_index  index.php; 
     include    fastcgi_params; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param  APPLICATION_ENV development; 
     fastcgi_param  HTTPS $https; 
    } 
} 

ответ

0

Вы можете достичь намеченную URL переписывания с помощью правильных правил перезаписи внутри вашего файла .htaccess.

Я предлагаю вам взглянуть на rewriteflags, особенно B flag

+0

Извините, я забыл предоставить важную информацию - есть две среды: test env с nginx и live env on. Просто отредактировал вопрос. – automatix

+0

Спасибо за ваш ответ! Флаги? 'B (escape backreferences)'? Не могли бы вы объяснить, как это решит проблему? – automatix

+0

Взяв URL-адрес википедии выше, рассмотрите правило: RewriteRule^wiki /(.*)$ /script.php?wiki=$1 [B] Это будет переписывать следующее: http://en.wikipedia.org/ wiki/Signal_% 28electrical_engineering% 29 в это: http://en.wikipedia.org/wiki/Signal_(electrical_engineering) – ManuelH

0

Вы должны показать нам свою конфигурацию Nginx fast_cgi.

Это несколько способов установить для PHP PHP PATH_INFO, и это строка, содержащая путь, которым ZF должен управлять.

Один из способов:

fastcgi_split_path_info ^(.+\.php)(/.+)$; 
fastcgi_param PATH_INFO $fastcgi_path_info; 

Из this post кажется, вы также можете использовать этот путь (названные захваты), чтобы избежать всех urlencoding содержания PATH_INFO:

location ~ ^(?<SCRIPT_FILENAME>.+\.php)(?<PATH_INFO>.+)$ { 
(...) 
fastcgi_param PATH_INFO $PATH_INFO; 

Так по крайней мере, вы бы определить, возникает ли проблема из-за слишком большого или недостаточного urlencoding.

Чтобы избежать urlencoding с веб-сервера (и, сделав то же самое с apache), вы можете управлять urldecoding пути на стороне PHP. Поскольку на этот раз вы знаете, что это никогда не будет urldecoded, и что вам придется делать это в php - или, может быть, вам придется его использовать, - вам нужно будет управлять тем, что путь может появиться в обеих версиях.

Возможно, это будет хорошая работа для Zend Framework Router. Одна из задач маршрутизатора - избегать таких вещей, как .htaccess переписывать правила в apache и управлять URL-адресами в приложении на стабильном и независимом от сервера сервере.

Первым шагом будет проверка строки пути и обнаружение необходимости кодирования url или нет. Конечно, если вы отправляете URL-адрес с символом url-кодированного и url-декодированного кода в одной и той же строке, все будет намного сложнее, поскольку вы не сможете решить (но это будет одинаково для веб-сервера) , И в вашем примере вы использовали круглые скобки, которые не были urlencoded в сгенерированном закодированном url, но закодированы в примере wikipedia, вашему приложению будет необходимо выбрать политику for the rfc protected characters.

+0

Спасибо за ваш ответ! Я уверен, что это не проблема ZF2, так как у меня также были проблемы с маршрутизацией и их устранение (см. [Здесь] (http://stackoverflow.com/questions/15634913/uris-with-german-special-characters- dont-work-error-404-in-zend-framework-2) и [здесь] (http://stackoverflow.com/questions/15658354/how-to-set-a-utf8-modifier-for-regex-of -a-регулярное выражение маршрутное-в-Зенд-рамки-2)). Запросы с (небезопасными) специальными символами в URI не доходят до приложения. В настоящее время у меня возникают проблемы с моей виртуальной машиной nginx. Когда я разрешу проблемы с VM, я предоставил конфигурацию 'fast_cgi'. – automatix

+0

Три недели спустя ... :) Я наконец решил проблемы с VM и только что обновил свой вопрос с помощью настроек nginx vhost. Я пробовал оба решения: 1. fastcgi_split_path_info^(. + \. Php) (/.+) $; fastcgi_param PATH_INFO $ fastcgi_path_info; '- нет chages; 2. 'location ~^(? . + \. Php) (? . +) $ {' (Вместо 'location ~ \ .php $ {') и 'fastcgi_param PATH_INFO $ PATH_INFO;' - PHP больше не отображается, и я могу загрузить файлы PHP. – automatix