Web-Server

哪個 Web 伺服器具有更好的重寫語法,可以更好地模仿 Apache 的語法?

  • September 1, 2011

由於大多數開源項目都包含與 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>

如果您試圖保留重寫規則,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;
}

只是為了給下一個訪問者一個完整的答案,lighttpd 確實支持重寫規則,儘管它們不直接支持等效的 -f 和 -d 標記來首先驗證同名文件和目錄的存在。

目前有三種解決方案:

  1. 等到功能 985被實施到標準發行版中,這通常應該在下一個 1.4.23 中發生。或者自己修補自己的版本。
  2. 使用 lighttpd 的mod_magnet進行測試。
  3. 把你的靜態文件放在一個固定的目錄下,比如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",
   )
}

引用自:https://serverfault.com/questions/17376