2014-03-06 144 views
9

對於Nginx我很新,所以請耐心等待。Nginx將所有來自子目錄的請求重定向到另一個子目錄根

我試圖將所有請求從一個子目錄(存儲)重定向到另一個子目錄(貿易)的根目錄。看到我的進展如下。目標子目錄(貿易)中的站點是一個magento站點,因此這是目前大部分規則的用處。

server { 
    server_name example.com *.example.com; 
    root /usr/share/nginx/html/example.com/public_html; 
    index index.php index.html index.htm; 

    access_log /var/log/nginx/example.access.log; 
    error_log /var/log/nginx/example.error.log; 

    location/{ 
      try_files $uri $uri/ /index.html; 
    } 

    location /trade/ { 
      index index.html index.php; 
      try_files $uri $uri/ @handler; 
      expires 30d; 
    } 

    location ~ /store { 
      rewrite /trade permanent; 
    } 

    location ~ ^/trade/(app|includes|lib|media/downloadable|pkginfo|report/config.xml|var)/ { internal; } 
    location /trade/var/export/ { internal; } 
    location /. { return 404; } 
    location @handler { rewrite//trade/index.php; } 

    error_page 404 /404.html; 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
      root /usr/share/nginx/html; 
    } 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    location ~ \.php$ { 
      try_files $uri =404; 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 

    } 


} 

我使用重定向的部分如下:

location ~ /store { 
     rewrite /trade permanent; 
} 

這適用於example.com/store而不是例如/存儲/ index.php文件或任何其他URI以ARGS。我有一種感覺,底部的php文件部分覆蓋了處理。這就是爲什麼我把商店位置放在前面,因爲文檔here聲明這將首先被處理。處理過程是否停止或繼續?

我已閱讀關於嵌套的PHP規則,但我試過這個無濟於事。

我將不勝感激任何幫助。

+0

什麼樣的參數? –

+0

舉例url將是http://www.example.com/store/index.php?page=shop.product_details&flypage=flypage.tpl&category_id=365&product_id=8025&option=com_virtuemart&Itemid=101 – user1214769

回答

3

好吧,

回到這裏我可以看到這個問題。

在Nginx中,當你預先指定一個位置指令〜這意味着你想在你的指令中處理正則表達式(區分大小寫,〜*不區分大小寫)。我相信所有的正則表達式都會在其他任何其他語言之前處理,但我會糾正的。

所以,當我使用:

location ~/store { 
     rewrite /trade permanent; 
} 

沒有正則表達式存在。它只是匹配/存儲和重定向交易。

經過一番調查(並對我的正則表達式,這是垃圾拋光),我回到它並提出了一個工作解決方案。

location ~ ^/store/(.*) { 
      rewrite ^/store(.*) /trade permanent; 
    } 

在這裏,我要求指令處理正則表達式,方法是輸入〜然後將任何url與/ store /相匹配。

然後,根據文檔,重寫語法是:

重寫正則表達式替換[國旗]

,所以我匹配與IT賣場的所有URL,並永久將其重定向到新的子文件夾。

真的很容易,實際上很尷尬,但嘿,每天都是學校的一天。我願意糾正這一切,並希望它能幫助某人。

30

OK嘗試這樣的事情

location ^~ /store(.*) { 
    return 301 $scheme://$http_host/trade$1$is_args$query_string; 
} 

試圖避免硬編碼的東西儘可能多地使用回報,因爲it's prefered over permanent rewrites

+3

感謝您的回覆,我會爲您投票但我沒有得到名聲! – user1214769

+1

沒關係不用擔心:-D –

+1

我不得不使用'〜*'來讓它起作用,例如, '位置〜* /store(.*){...}' – fideloper

0

你需要確保你的location ~ \.php$處理程序不會採取下面的舊的任何URL夾。事實上,優先規則清晰地記錄在http://nginx.org/r/location之內,並且您可以使用正則表達式,或者更好的是,使用基於前綴的匹配與^~修飾符來指示搜索必須停止,而不嘗試查看是否基於正則表達式\.php$location將匹配:

location ^~ /old/long/path/ { # will match /old/long/path/index.php, too 
     rewrite ^/old/long/path/(.*)$ /new/$1 permanent; 
    } 

上面的代碼可能是這樣做的最有效的方式,但在這裏是做同樣的另一種方式:

location ~ /old/long/path/(.*) { 
     return 301 /new/$1$is_args$args; 
    } 

爲什麼一個例子具有$is_args$args,另一個不?好問題!請注意,location指令以及rewrite指令的第一個參數都基於$uri變量的內容進行操作,而不是$request_uri。長話短說,但$uri不包含$args,所以,在這兩種情況下,$1將不包含任何args;但在rewrite的情況下,該情況被認爲非常普遍,$args會自動加回nginx,除非新字符串以?字符結尾,請參閱http://nginx.org/r/rewrite

相關問題