Web-Server
哪個 Web 伺服器具有更好的重寫語法,可以更好地模仿 Apache 的語法?
由於大多數開源項目都包含與 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 標記來首先驗證同名文件和目錄的存在。
目前有三種解決方案:
- 等到功能 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", ) }