2013-06-12 263 views
0

我一直在這一塊撞了我的頭一陣子,但有人可以請幫我找出爲什麼這在我的location /塊不匹配http://chrisbenard.net/wp-content/uploads/2010/12/chromeosalbum.pngnginx返回404後,重寫到存在的url

這是匹配和重定向http://chrisbenard.net/wp-content/uploads/2010/12/http://chrisbenard.net/assets/uploads/2010/12/

文件chromeosalbum.png顯然是在正確的目錄中。此問題擴展到該目錄下的所有文件。

if (!-e $request_filename){ 
    rewrite ^/wp\-content/uploads/(.+)? /assets/uploads/$1 permanent; 
} 

此外,我想/?s=query/search/#?query=query。我試過了:

rewrite ^/\?s\=(.*)$ /search/#?query=$1; 

那個也沒有這個把戲。我所有的其他正則表達式替換工作正常。我已經從wordpress安裝遷移到PieCrust,這就是爲什麼我需要做所有這些重定向。

我試過第一個正則表達式,其中(.*),(.*)?,(.+)和其他一些變化。我甚至嘗試用.*content替換wp\-content,認爲可能逃跑會以某種方式搞砸。我沒有運氣。

編輯:此外,這個相同的正則表達式在Apache中工作正常(對於資產目錄;我無法獲得搜索正則表達式的工作)。我用的是這樣的:

RewriteBase/
... 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^wp\-content/uploads/(.*)? /assets/uploads/$1 [NC,R=301,L] 

有一個在Apache的版本沒有領先的睫毛,因爲它不包括在字符串的開頭就像是在nginx的。再次,所有其他nginx規則工作正常,但這些例外2.

在此先感謝!

編輯2:事實證明,它只發生在重寫的目的地存在。

例如,這重定向到正確的網址: http://chrisbenard.net/wp-content/uploads/2010/12/garbage.file.png

這並不重定向到正確的網址,只是返回一個404(但如果你改變的wp-content資產,它會加載罰款): http://chrisbenard.net/wp-content/uploads/2010/12/chromeosalbum.png

+0

我想你需要從'wp \ -content'中刪除連字符。我剛剛嘗試過使用別名,它對我很有用:'location〜^/wp-content/uploads /(.*){別名/ your/absolute/path/here/assets/uploads/$ 1; }'。如果文件存在以獲得更好的性能,最好避免測試。或者試試這個:'location〜^/wp-content/uploads /(.*){rewrite ^/wp-content/uploads /(.+)/ assets/uploads/$ 1 permanent; }' –

+0

我不想別名,因爲我想永久重定向。第二個可能會工作,但這並不能讓我將圖像的標題設置與重寫相結合。我不得不復制規則(或者我想移動它們),正如我在下面的答案中發佈的那樣。所以不會讓我接受我的答案2天。 –

+0

你可以直接在'location'塊中使用'add_header'。 –

回答

0

此塊匹配和干擾:

location ~* \.(?:ico|svg|css|js|gif|jpe?g|png)$ { 
    expires 3d; 
    add_header Pragma public; 
    add_header Cache-Control "public"; 
} 

即使我做到了這一點,我仍然有一個問題:

location ~* \.(?:ico|svg|css|js|gif|jpe?g|png)$ { 
    if (-e $request_filename) { 
     expires 3d; 
     add_header Pragma public; 
     add_header Cache-Control "public"; 
    } 
} 

我最終剛剛複製了一些我的重寫規則在匹配的位置,它的工作原理,但我不明白爲什麼。我想這只是最具體的比賽,所以它忽略了location /中的規則。

location ~* \.(?:ico|svg|css|js|gif|jpe?g|png)$ { 
    if (-e $request_filename) { 
     expires 3d; 
     add_header Pragma public; 
     add_header Cache-Control "public"; 
    } 

    if (!-e $request_filename){ 
     rewrite "^/wp\-content/uploads/(.+)?" /assets/uploads/$1 permanent; 
    } 
    if (!-e $request_filename){ 
     rewrite ^/images/(.*)? /assets/images/$1 permanent; 
    } 
}