nginx 如何重写“A.php(虚)“到”B.php(实)”?避免A.php被fastcgi解析为404

2013-12-15 17:16:28 +08:00
 h2sky
需要重写./php/文件夹下的1.php 到index.php

因为location ~ .*\.php$ 全部交给fastcgi了,会显示404 无法重写
在location ~ .*\.php$ 前重写规则 php又无法解析


怎么办?

location ~ .*\.php$
{
fastcgi_pass unix:/tmp/php-cgi-f.sock;
fastcgi_index index.php;
include fcgi-host.conf;
fastcgi_param DOCUMENT_ROOT /web$subdomain;
fastcgi_param SCRIPT_FILENAME /web$subdomain$fastcgi_script_name;
}

location ~ ^/ {

rewrite ^/php/([0-1000]+).php$ /php/index.php?id=2&cid=$1&num=$args last;

}

(不直接写入到php里面而重写有各种原因,只求用nginx解决这个问题)
2747 次点击
所在节点    问与答
7 条回复
tempdban
2013-12-15 17:25:14 +08:00
location ^~ /php/

放在最前面
h2sky
2013-12-15 17:28:37 +08:00
@tempdban php会不解析
hitsmaxft
2013-12-15 19:39:10 +08:00
每个location是相互独立的, 意味着 ^/ 下虽然已经成功完成了rewrite, 但是这个location下并没有 fastcgi 配置, 所以会返回代码文本

解决方法就是吧 fastcgi相关配置复制到 ^/ 内部
建议用include解决fastcgi 配置重复的问题

还有一个方法, 在location 之前加一个 if rewrite , 在locaiton 区块之外完成内部的url重定向
dallaslu
2013-12-15 19:41:33 +08:00
[0-1000] 正则可以这样写吗?为什么我的第一反应是不应该这么写的呢
hitsmaxft
2013-12-15 19:41:39 +08:00
再提供一份合理的配置指南 http://huoding.com/2013/10/23/290

用 try_file 解决不必要的404
dallaslu
2013-12-15 19:44:34 +08:00
比如 "\d+"、"\d{1,4}"、"[1-9]?\d+"、"1?[1-9]?\d{2}",我感觉这样才是对的
h2sky
2013-12-15 20:24:16 +08:00
@hitsmaxft 感谢指导,问题终于解决了


@dallaslu 可以的,nginx、apache 下都能用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/93243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX