На сайте 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;
}
}
Извините, я забыл предоставить важную информацию - есть две среды: test env с nginx и live env on. Просто отредактировал вопрос. – automatix
Спасибо за ваш ответ! Флаги? 'B (escape backreferences)'? Не могли бы вы объяснить, как это решит проблему? – automatix
Взяв 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