2016-02-16 40 views
0

我有問題,我想重寫除特定文件夾以外的所有子域。 問題是這是在一個Docker容器內部運行一個外部卷,它是不同主機的動態主機名。所以我必須使用$ hostname。 只要您使用$ hostname,它就會產生與正則表達式規則相同的威脅。因此,爲www創建一個規則不起作用,因爲它對www。$ hostname具有和*。$ hostname相同的威脅,或者在那裏有一個正則表達式。ngnix重定向除www外的每個子域到特定路徑

我想多東西,直接從服務器名稱的變量沒有在所有的工作中提取它,我現在在帶負先行的條件正則表達式是任何正則表達式測試儀工作正常,但不是在ngnix 我2016/02/16 12:28:14 [emerg] 1#0:invalid condition「(?!www。)(\ w」in/etc/nginx/sites-enabled/default:10

任何人都可以?思路

server { 
    listen 443 ssl; 
    listen 80; 
    server_name *.$hostname; 
    error_log /var/log/nginx/rewrite.log debug; 
    root /src/webapp/dist; 
    ssl_certificate /etc/nginx/ssl/server-cert.pem; 
    ssl_certificate_key /etc/nginx/ssl/server-key.pem; 

    if ($http_host ~ ((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.$hostname)) { 
     set $subdomain $1; 
     return 301 $scheme://www.$hostname/#/$subdomain/media/portfolio/1; 
     break; 
    } 

} 

下面的框還測試,相同的結果沒有重定向工作可言,再次它位於泊塢窗容器內用ngninx 1.4.6-1ubuntu3.4:

server { 
    listen 80; 
    listen 443 ssl; 
    server_name www.$hostname; 
    root /src/webapp/dist; 

    ssl_certificate /etc/nginx/ssl/server-cert.pem; 
    ssl_certificate_key /etc/nginx/ssl/server-key.pem; 

} 

server { 
    listen 80; 
    listen 443 ssl; 
    server_name *.$hostname; 

    ssl_certificate /etc/nginx/ssl/server-cert.pem; 
    ssl_certificate_key /etc/nginx/ssl/server-key.pem; 

    return 301 $scheme://www.$hostname/#/media/portfolio/1; 
} 

回答

0

您可以使用兩個服務器塊來處理它。第一個服務器塊將處理www.$hostname,第二個服務器塊將適用於所有其他情況。

下面是一個例子:

server { 
     listen 80; 
     listen 443 ssl; 
     server_name www.$hostname; 

     ssl_certificate /etc/nginx/ssl/server-cert.pem; 
     ssl_certificate_key /etc/nginx/ssl/server-key.pem; 
     # Do whatever you want here 
} 

server { 
     listen 80; 
     listen 443 ssl; 
     server_name *.$hostname; 

     ssl_certificate /etc/nginx/ssl/server-cert.pem; 
     ssl_certificate_key /etc/nginx/ssl/server-key.pem; 
     # Do whatever you want here 
} 

如果你一直在惦記着一些有條件的if語句 - 算了吧。這是一個壞主意。 Nginx支持if,但它們僅適用於非常極端的情況,因此它們的使用非常令人沮喪,因爲它們不像正常的編程語言那樣工作。

+0

另一種解決方案由於Nginx的一些奇怪的行爲此NIS什麼,我說,我已經嘗試過。它不工作,因爲它被hjust忽略 – Mario

+0

@Mario請用您的確切代碼更新您的問題我測試了我發佈的代碼,它確實有效。 –

+0

粘貼上面,仍然無法正常工作,沒有使用其他配置,但我發現你不能在正則表達式中使用變量 – Mario

0
server { 
    listen 443 ssl; 
    listen 80; 
    server_name *.$hostname; 
    error_log /var/log/nginx/rewrite.log debug; 
    root /src/webapp/dist; 
    ssl_certificate /etc/nginx/ssl/server-cert.pem; 
    ssl_certificate_key /etc/nginx/ssl/server-key.pem; 

    if ($host ~* "((?:\w+(?:-\w+)*\.)*)((?!www\.)\w{3,}(?:-\w+)*)(\..*\.muc\.pom)") { 
     set $subdomain $2; 
     return 301 $scheme://www.$hostname/#/$subdomain/media/portfolio/1/about; 
     break; 
    } 

} 

Ngninx不知何故不能夠在正則表達式中使用變量,所以我必須避開與DNS的結局一點點,供生產使用,應該也更好的解決方案,但興田正則表達式是匹配和重寫。

我知道的是壞的,如果有人能想出的搬運工,請隨時分享

相關問題