首页 > 解决方案 > nginx - 用 php 文件重写 js 文件

问题描述

使用 apache,我使用文件 config.php 重写基于域的文件 config.js,config.js 包含被RewriteRule指令替换的占位符,这是 .htaccess 文件:

<IfModule mod_rewrite.c>
    RewriteBase /foo
    RewriteEngine On
    RewriteRule config.js config.php [L,QSA]
</IfModule>

当我进入 URL production.com/foo/config.js 我看到一些值,而不是进入 develop.com/foo/config.js 我看到其他值,定义到 config.php

现在我需要转移到 nginx 但我不明白如何复制 apache 规则,我试过:

location /foo {
  alias /src/www/foo;
  index index.html;
  rewrite config.js config.php break;
  }

但是有内部服务器错误

谢谢

标签: nginx

解决方案


所有 nginx URI 都以斜杠开头。使用rewrite config.js config.php你正在重写一个 URI 从/foo/config.jsto config.php。nginx 无法处理该 URI,导致内部服务器错误。

指令的第一个参数rewrite始终被视为点匹配任何符号的正则表达式。因此,您的rewrite规则将匹配任何包含子字符串的config*js字符串。我不认为这是你真正想要的。

指令的第二个参数rewrite是一个全新的 URI,而不是字符串的替换部分。要进行替换,请使用类似rewrite ^(.*)old-string(.*)$ $1new-string$2.

由于您正在将请求重写为 PHP 脚本,因此您应该强制 nginx 使用定义 PHP-FPM 处理程序的位置来处理新的 URI。为此,您应该在指令last中使用标志而不是标志。breakrewrite

总结所有这些,你需要类似的东西

location /foo {
    alias /src/www/foo;
    index index.html;
    rewrite ^/foo/config\.js$ /foo/config.php last;
}

再来一注。正如 nginx 文档所述

当 location 与指令值的最后一部分匹配时:

location /images/ {
    alias /data/w3/images/;
}

最好使用 root 指令:

location /images/ {
    root /data/w3;
}

因此,如果子字符串确实相等,则最好在此块中使用root /src/www;而不是alias /src/www/foo;在此块中使用。locationfoo


推荐阅读