nginx alias别名配置为什么会出现重定向

by pxz


发布于: 2018-08-20 所属分类: php linux 标签: nginx  831


<p>近段时间配置的一个api多版本共存的配置过程中, 遇到了一个奇怪的问题 </p> <p>先贴配置</p> <pre><code> server { charset utf-8; client_max_body_size 128M; sendfile off; listen 80; server_name api.xxx.com; #access_log logs/host.access.log main; root /www/api/web; location ~ /v(?<version>(\d+))/(?<after_ali>(.*)\.(php|php5)$) { root /www/api/versions/v$version/web; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/${after_ali}; } location ~ /v(?<version>(\d+))/ { alias /www/api/versions/v$version/web/; } location / { try_files $uri $uri/ /index.php$is_args$args; index index.php index.html index.htm; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~\.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; try_files $uri =404; } } </code></pre><p>我首先加了这一部分, </p> <pre><code> location ~ /v(?<version>(\d+))/(?<after_ali>(.*)\.(php|php5)$) { root /www/api/versions/v$version/web; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/${after_ali}; } </code></pre><p>.php结尾的动态文件测试通过后, 加了第二部分做静态文件的目录映射</p> <pre><code>location ~ /v(?<version>(\d+))/ { alias /www/api/versions/v$version/web/; } </code></pre><p>然后我在 /www/api/versions/v2/web/ 新建了一个 test.html, 然后访问 <a href="http://api.xxx.com/v2/test.html">http://api.xxx.com/v2/test.html</a> , 链接会被201重定向到的 <a href="http://api.xxx.com/v2/test.html/">http://api.xxx.com/v2/test.html/</a> 并提示403 Forbidden错误, 为什么会出现这种情况, 这个问题想了很久, 还是没想明白, 各种百度谷歌没找到答案, 最后翻找到nginx的配置文档, <code>http://nginx.org/en/docs/http/ngx_http_core_module.html#alias</code> 在这里找到了原因</p> <p><img src="http://www.sgzhang.com/uploads/2018/08/6343b74b0947381c920c1e82376e9714.png" alt=""></p> <p>上图是nginx里面alias用法的文档说明,这里作了说明, 如果在使用正则表达式定义的位置内使用别名, 在alias里面必须引用正则匹配的问分, 并且必须为具体的文件, 而不是一个目录</p> <p>所以上面的第二部分的配置是错误的, 于是我把它修改成这样</p> <pre><code> location ~ /v(?<version>(\d+))/(?<after_ali>(.*)\.(html|js|css|jpg|jpeg|gif|png)$) { alias /www/api/versions/v$version/web/$after_ali; } </code></pre><p>再次访问 <code>http://api.xxx.com/v2/test.html</code> 正常显示</p>

发表评论

暂无评论

搜索
用户登陆