我是NGINX的新手,对正则表达式很恐怖。这就是我需要的:
重写规则:
我做了很多谷歌搜索,似乎找不到我需要的东西。甚至没有一篇支持文章告诉我有关正则表达式的nginx使用的更多信息。这是我最好的猜测:
location / {
rewrite ^(?!(/images/))(.*)$ profile.html?id=$2 break;
return 403;
}
我把它放在我的nginx.conf文件中。它有点奏效。它会将mysite.com/SOMETHING
之类的任何请求重写为mysite.com/profile.html?id=SOMETHING
,但是,它也会将mysite.com/
重写为mysite.com/profile.html?id=
。 / images / exclusion似乎有效(因为我的图像正确加载),但是,即使转到mysite.com/index.html
也会重写为mysite.com/profile.html?=id=index.html
。
非常感谢任何帮助。
答案 0 :(得分:0)
我认为一条规则可以处理所有这些,但我会假设一些事情你需要确认它。
对于root位置,有一个index.php 对于/ images和/file.html我会假设这些文件存在确切路径并为它们提供服务,我会在编写规则后解释更多
server {
server_name mydomain.com; # maybe www.mydomain.com too
index index.php; # or index.html, depending on ur app structure
location ~ /(.*) {
try_files $uri $uri/ /index.html?profile=$1;
}
}
/images/image.png
和file.php
/ file.html
将全部匹配第一个规则$uri
,root将提供index.php(虽然不太确定)并且当所有失败时(与您的/something
网址一样,它会尝试/index.html?profile=something
ps:我会使用$request_uri
而不是$1
,但它包含第一个/
,所以它会评估为/index.html?profile=/something
,我认为这不适用于你的{{1}}代码。
答案 1 :(得分:0)
我找到了一个有效的解决方案,但我怀疑正则表达式匹配占用了一些CPU时间,可能会降低我网站的性能。我将继续寻找改进的解决方案,但这就是我最终解决问题的方法:
#Location routing for user accounts
location = / {
break;
}
location / {
rewrite ^(?!(/images/|(.*\..*)))(.*)$ /profile.html?id=$2 break;
rewrite ^(.*)$ $1 break;
return 403;
}
#end location routing for user accounts
我把它放在server { }
文件的nginx.conf
块内。第一个块location =/ { }
检查位置是/
(Web根目录)还是仅/
,然后执行与正常服务器操作不同的任何操作,然后它应该转义所有位置处理/ url重写。
接下来,location / {
块匹配webroot中的任何URI。这里是rewrite
和正则表达式匹配的位置。首先,重写引擎尝试将URI与正则表达式^(?!(/images/|(.*\..*)))(.*)$
匹配,这要求URI不以/images/
OR {{1}开头(以该格式提供的任何内容),然后接受任何单词file.ext
,并将其抛入重写的url,然后所有url重写中断,服务器为页面提供服务。
如果URI与正则表达式不匹配,例如,URI = (.*)
或URI = /images/arrow.png
或URI = /folder/
,则会转到下一条规则。下一个规则只接受您的URI并重写相同的URI。我不能说这种策略的效率,特别是因为你永远不会达到/profile.php
声明,我觉得可能有更好的方法来做到这一点。我尝试使用return 403;
,但我没有成功。这是现在的工作,符合我的标准。似乎缺乏一点性能,但我必须忍受它,直到我可以改进。