由于大多数开源项目都包含与 Apache 配合使用的 mod_rewrite 规则,因此我需要能够将它们转换为与 lighttpd 或 nginx 配合使用。哪个 Web 服务器允许我将规则完全转换为 Apache 中的等效规则?如果两者都可以完全转换,哪一个具有更好的语法和高级选项,可以更好地模仿 Apache?
例如,我将使用 Wordpress 的 .htaccess。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
答案1
如果您想保留重写规则,nginX 似乎是最佳选择。
可以这样做:
if (!-e $request_filename) {
rewrite ^([_0-9a-zA-Z-]+)?(/.*) $2 break;
rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;
rewrite ^ /index.php last;
}
但 nginX 的强大之处在于它拥有更少的复杂性、更小的规则,所以这可能是替代它的更好方法:
if (!-e $request_filename) {
rewrite ^ /index.php last;
}
答案2
只是为了给下一位访问者一个完整的答案,lighttpd 确实支持重写规则,尽管它们不直接支持 -f 和 -d 标签的等效项来首先验证同名文件和目录的存在。
目前有三种解决方案:
- 等到功能 985已实现到标准发行版中,这通常会在下一个 1.4.23 中发生。或者您自己修补自己的版本。
- 使用 lighttpd 的mod_magnet来测试一下。
将您的静态文件放在固定目录中,例如 medias,并为该目录设置例外,例如:
$HTTP["host"] == "yoursite" { # all other config here ... alias.url = ( "/medias" => "/var/www/yoursite/public/medias" ) url.rewrite-once = ( "^/medias/(.*)" => "$0", "^/(.*)$" => "/index.php/$1", "^/$" => "/index.php", ) }
答案3
也许可以研究一下“Cherokee”网络服务器。它是 Apache 的轻量级、快速替代品,并且具有一些非常不错的功能。
答案4
不管哪个“轻量级”网络服务器速度更快(它们都比 Apache 快得多)。对于 Cherokee,我要说的是,它的管理 Web 界面非常容易使用。显然,由于它是基于 Web 的,因此配置与 Apache 有很大不同。我会称它为令人愉快的替代品,而不是令人恼火的替代品。
但归根结底...,只有 Apache 才是 Apache。Apache 的优势在于其 AAA 级灵活性。