在基于Zend Framework 2的网站上(nginx上的测试环境和Apache上的实时环境),有一个类别“课程”,其页面有这样的URI:
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
并始终获得您想要的页面。
有人知道,如何实现这种行为(“维基百科”)? (可能使用.htaccess
规则进行HTTP重定向?)
更新:
的/ etc / nginx的/ AX-共同的虚拟主机
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 :(得分:0)
您可以通过在.htaccess文件中使用正确的重写规则来实现预期的URL重写行为。
我建议您查看rewriteflags,尤其是B flag
答案 1 :(得分:0)
您应该向我们展示您的nginx fast_cgi配置。
它们可以通过多种方式为PHP设置 PATH_INFO ,这是包含ZF必须管理的路径的字符串。
一种方法是:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
从this post开始,您似乎也可以使用这种方式(命名捕获)来避免PATH_INFO内容的所有urlencoding:
location ~ ^(?<SCRIPT_FILENAME>.+\.php)(?<PATH_INFO>.+)$ {
(...)
fastcgi_param PATH_INFO $PATH_INFO;
所以至少你会发现问题来自于过多或过多的urlencoding。
通过避免来自网络服务器的urlencoding(并通过对apache执行相同操作),您可以管理PHP端路径的urldecoding。因为这次你知道它永远不会被urldecoded,并且你必须在php中执行它 - 或者你可能必须对它进行urlencode - weel你必须管理路径可能在两个版本中都有的事实。
对Zend Framework Router来说,这可能是个不错的选择。路由器的工作之一就是避免像.htaccess在apache中重写规则这样的事情,并以稳定的,与webserver无关的方式管理应用程序中的url。
第一步是测试路径字符串并检测是否需要进行url编码。 当然,如果你在同一个字符串中发送带有url编码和url解码字符混合的url,那么事情会变得更加困难,因为你无法决定(但对于网络服务器来说也是如此)。在您的示例中,您使用了在生成的编码网址中未进行urlencoded但在维基百科示例中编码的括号,您的应用程序必须选择策略for the rfc protected characters。