我对 nginx 还很陌生,正在尝试设置一些非常简单的重写规则,但它们似乎不起作用。
仅供您参考,这server { .. }
有它的server_name domain.com *.domain.com
。
我有这个rewrite ^ /index.php?/$request_uri;
,它似乎工作得很好。它将匹配 domain.com/asd/sad/sad,一切正常。
但是,我想用子域名做一些有趣的事情……所以我有s1.domain.com
,s198.domain.com
但是我想更改我的重写,以便它转到,/index.php?/s1/$request_uri
如果这有意义吗?因此子域名在之前进入$request_uri
。
这是我迄今为止尝试过的:
if ($host ~* ^([a-z]+)\..*) {
rewrite ^(.*)$ /index.php?/$1/$request_uri;
}
rewrite ^ /index.php?/$request_uri;
非常感谢您提供的任何帮助!
谢谢。
答案1
首先:if
Nginx 作者不鼓励使用 ,原因很简单:它有非常严重的副作用。您可能仍会在简单的用例中使用它,但同时使用if
和rewrite
就像是一颗炸弹。
server
您的用例可以使用两个部分轻松实现:
server {
server_name domain.com;
rewrite ^ /index.php?/$request_uri last;
}
server {
server_name ~ ^(?<SUB>.+)\.domain.\com$ ;
rewrite ^ /index.php?/$SUB/$request_uri last;
}
答案2
您可以将规则更改为
rewrite ^ /index.php?/$host/$request_uri;
但不幸的是,这会让您得到像 '/index.php?/s1.domain.com/asd/sad/sad' 这样的“路径”,而不是您所期望的 '/index.php?/s1/asd/sad/sad'。
您是否可以简单地$_SERVER['HTTP_HOST']
在 PHP 脚本中使用变量并在脚本本身中找出适当的更改,而不是让 nginx 完成所有工作?
编辑后添加:
在你发表关于 FuelPHP 的评论之前写了这篇文章;不知道那是什么,但我猜想这意味着你无法或不愿意(这并不是一件坏事)按照我的建议对脚本进行更改。虽然你在那里发布的 Apache 规则不会自动执行你对任何给定子域的要求——它适用于 dev.domain.com,但不适用于其他。