使用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时,我看到了一些值,而进入development.com/foo/config.js时,我会看到其他值,这些值定义在config.php 中
现在我需要转到nginx,但我不知道如何复制apache规则,我尝试了:
location /foo {
alias /src/www/foo;
index index.html;
rewrite config.js config.php break;
}
但存在内部服务器错误
感谢
所有nginx URI都以斜杠开头。使用rewrite config.js config.php
将URI从/foo/config.js
重写为config.php
。nginx无法处理该URI,导致内部服务器错误。
rewrite
指令的第一个参数始终被视为正则表达式,其中点与任何符号匹配。因此,您的rewrite
规则将匹配任何包含config*js
子字符串的字符串。我不认为这是你真正想要的。
rewrite
指令的第二个参数是一个全新的URI,而不是字符串的替换部分。要进行替换,请使用类似rewrite ^(.*)old-string(.*)$ $1new-string$2
的东西。
由于您正在将请求重写为PHP脚本,因此应该强制nginx在定义PHP-FPM处理程序的位置处理新的URI。要做到这一点,您应该使用last
标志,而不是break
标志和rewrite
指令。
综上所述,你需要像这样的东西
location /foo {
alias /src/www/foo;
index index.html;
rewrite ^/foo/config.js$ /foo/config.php last;
}
还有一个注意事项。正如nginx文档所述:
当位置与指令值的最后一部分匹配时:
location /images/ { alias /data/w3/images/; }
最好使用根指令:
location /images/ { root /data/w3; }
,因此如果foo
子串真的相等,则在该location
块内使用root /src/www;
而不是alias /src/www/foo;
会更好。