打开 phpstudy 面板,何开切到“网站”选项卡,何开找到你要配置的何开那个站点,点右侧的何开“管理”按钮,选“修改”。何开弹出的何开窗口里有个“伪静态”输入框——这就是 nginx 下 rewrite 规则的入口。很多人卡在这一步,何开以为 phpstudy 会自动帮你把 .htaccess 转成 nginx 规则,何开其实不会。何开你得自己把规则贴进去,何开或者选一个 phpstudy 内置的何开框架模板。
我见过太多人在这里翻车。何开比如用 ThinkPHP 的何开项目,.htaccess 里写着 RewriteRule ^(.*)$ index.php?何开s=$1 [QSA,PT,L],直接复制到 nginx 伪静态框里,何开保存后访问首页正常,点进内页就 404。原因很简单:nginx 不认 Apache 的 RewriteRule 语法。你得换成 nginx 的 try_files 或者 rewrite 指令。
phpstudy 的伪静态输入框本质上就是往站点的 nginx 配置文件里插入一段 location / { ... } 块。你写进去的内容会被原样塞进 server 段。所以别写 <IfModule> 那种 Apache 标签,写了 nginx 直接启动失败。正确的做法是只写 nginx 原生指令。比如 ThinkPHP 5 的规则:
location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } } 保存之后,phpstudy 会提示你重启 nginx。别忽略这个提示。我试过不重启直接刷新页面,规则根本没生效,因为 nginx 的工作进程还在用旧配置。重启按钮就在 phpstudy 首页的“启动/停止”区域,点一下 nginx 的“重启”就行。
还有一种情况:你用的是 phpstudy 的“一键启动”模式,nginx 和 php-cgi 都在跑,但伪静态规则死活不生效。这时候去检查站点根目录下有没有 .htaccess 文件。nginx 默认不读这个文件,但 phpstudy 的某些版本会尝试解析它。如果 .htaccess 里写了规则,而你在伪静态框里又写了一遍,两套规则打架,结果就是 500 错误或者无限重定向。把 .htaccess 删掉或者重命名,只保留伪静态框里的 nginx 规则,问题就解决了。
另外,phpstudy 的 nginx 配置文件默认放在 phpstudy_pro/Extensions/Nginx1.16.1/conf/nginx.conf 这种路径下。你手动改这个文件也行,但下次在面板里点“修改”伪静态,phpstudy 会覆盖你的改动。所以别直接改主配置文件,老老实实用面板的伪静态框。我有个朋友图省事,直接往 nginx.conf 里塞了一堆 rewrite,结果某天在面板里切换了 PHP 版本,配置被重置,网站全挂。排查了半天才想起来是这里的问题。
如果你用的框架有官方 nginx 规则,比如 Laravel 的:
location / { try_files $uri $uri/ /index.php?$query_string; } 直接贴进去就行。注意 Laravel 不需要 if (!-e ...) 那种写法,try_files 更高效。phpstudy 的伪静态下拉菜单里其实内置了 Laravel、ThinkPHP、WordPress 等常见程序的规则,选一下就能自动填充。但内置规则不一定匹配你的项目版本,比如 WordPress 的规则在子目录安装时会出问题。所以最好还是手动写。
最后说一个坑:phpstudy 的 nginx 默认开了 autoindex on,如果你 rewrite 规则写错了导致目录列表被暴露,别人能直接看到你服务器上的文件。检查一下伪静态规则里有没有漏掉 index index.php index.html; 这行。没有的话,在伪静态框开头加上。别问我是怎么知道的——上周刚帮人处理过一个因为目录遍历导致源码泄露的站。