Apache-2.2

需要幫助將此 htaccess 重寫規則轉換為 Nginx

  • July 31, 2012

嗨 - 我已經為此苦苦掙扎了好幾天。這看起來很簡單,但我就是做不到。

我有一個用 CakePHP 開發的網站。有一個響應的腳本/css/profiles/g/whatever.css(“whatever”是什麼,它實際上是一個傳遞給動作的參數),它回顯生成的 CSS 並將其保存到/css/profiles/whatever.css.

我在 Apache 中有一條規則,它接受請求/css/profiles/whatever.css,如果它不存在,則重寫請求/css/profiles/g/whatever.css而不重定向,因此客戶端永遠不會注意到它是由腳本響應並且文件不存在。

這就是我在 Apache 中所擁有的:

# Profile CSS rules
RewriteCond %{REQUEST_URI} ^/css/profiles/
RewriteCond %{REQUEST_URI} !/css/profiles/g/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^css/profiles/(.*)$ /css/profiles/g/$1 [L]

# CakePHP's default rules
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]

現在我將站點移動到帶有 Nginx 的伺服器上,到目前為止,我得到了這個:

# Profile CSS rules
location ~ ^/css/profiles/(?!g/)(.*)$ {
   if (!-f $request_filename) {
     rewrite ^/css/profiles/(.*)$ /css/profiles/g/$1 last;
     break;
   }

 }

# CakePHP's default rules
location / {

    嘗試文件 $ uri $ uri //index.php? $ uri& $ 參數;}

條件似乎有效,因為如果我去/css/profiles/whatever.css列印 PHP 的$_SERVER變數,它會給我

[QUERY_STRING] => /css/profiles/g/whatever.css&

注意&. 這意味著它到達了該try_files部分並將 . 添加$uri到查詢字元串中,並且它具有正確的$uri.

但…

[REQUEST_URI] => /css/profiles/whatever.css

這就是故障。似乎它並沒有真正改變$request_uriCakePHP 需要控制什麼控制器參與什麼。

任何幫助將不勝感激。

謝謝。

所以我終於讓它工作了:

location ~ ^/css/profiles/(?!g/)(.*)$ {
  set $new_uri /css/profiles/g/$1;
  if (!-f $request_filename) {
    rewrite ^/css/profiles/(.*)$ /css/profiles/g/$1 last;
 }
}

…最後:

location ~ \.php$ {
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi_params;

 ... some other stuff were here related to fastcgi
 fastcgi_param PATH_INFO $new_uri; # <--- I added this
}

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