nginx 重写特定子域名

nginx 重写特定子域名

我正在尝试重写批准列表之外的任何子域名,即 (dev,test,home).domain.com

以下是我现在正在处理的内容:

#rewrite all sub domains
 if ($host ~* "^([^.]+(\.[^.]+)*)\.domain.com$"){
        rewrite ^(.*)$ http://domain.com$1 permanent;
        break;
    }

问题是它重写了所有子域。我在 apache 中有一个解决方案,但我在转换它时遇到了问题。apache 版本:

RewriteCond %{HTTP_HOST} !^(dev|test|local\.blog)\.domain\.me$ [NC]

更新:

server {
    listen 80;
  server_name *.domain.com domain.com;
  root /srv/www/www.domain.com;
  access_log /srv/logs/www_domain.com.access;
  error_log /srv/logs/www_domain.com.error error;

  error_page 400 401 402 403 404 500 502 503 504 /error.htm;
  location  /error.htm {
    internal;
  }
  # ------------------------------------------------------------------------  
  # remove all sub domains and www
  if ($host !~* (dev|test|prod)\.domain\.com) {
            rewrite ^ http://domain.com$request_uri permanent;
    }
  # ------------------------------------------------------------------------
  location / {
    index index.html index.php index.htm;
    location ~* ^.*\.php$ {
      include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      }
  }
  # ------------------------------------------------------------------------
  # serve favicon
  location = /favicon.ico { 
    log_not_found off;
    access_log off;
  }
    # ------------------------------------------------------------------------
  # process robots.txt
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
    # ------------------------------------------------------------------------
  # serve static files directly
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
    access_log off;
    expires max;
  }
    # ------------------------------------------------------------------------
  # block access to .ht files
  location ~ /\.ht {
    deny  all;
  }
  # ------------------------------------------------------------------------
    # short cuts
    if ($uri ~* "/login") {
        rewrite ^/login(/.*)? /wp-admin$1;
    }
    # ------------------------------------------------------------------------
    # BEGIN W3TC Browser Cache
    gzip on;
    gzip_types text/css application/x-javascript text/richtext image/svg+xml text/plain    text/xsd text/xsl text/xml image/x-icon;
    location ~ \.(css|js)$ {
            expires 31536000s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
            expires 180s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=180, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
            expires 31536000s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    # END W3TC Browser Cache
    # BEGIN W3TC Skip 404 error handling by WordPress for static files
    if (-f $request_filename) {
            break;
    }
    if (-d $request_filename) {
            break;
    }
    if ($request_uri ~ "(robots\.txt|sitemap(_index|[0-9]+)?\.xml(\.gz)?)") {
            break;
    }
    if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
            return 404;
    }
    # END W3TC Skip 404 error handling by WordPress for static files
    # ------------------------------------------------------------------------
}

答案1

查看nginx 文档如何将 apache 重写规则转换为 nginx。

server {
  listen 80;
  server_name domain.com ~(dev|test|local)\.domain\.com$;

  # ... your rules here ... 

}

server {
  listen 80 default_server;
  server_name *.domain.com;
  rewrite ^ http://domain.com$request_uri? permanent;
}

答案2

根据@AlexD 的回复,我更新了我的解决方案。如果你们还有其他建议,请告诉我。

server {
  listen 80;
  server_name *.noconformity.co;
  rewrite ^ http://noconformity.co$request_uri? permanent;
}
server {
  listen 80;
  server_name noconformity.co ~(sub1|sub2)\.noconformity\.co$;
  root /srv/www/www.noconformity.co;
  access_log /var/log/nginx-hosts/www_noconformity.co.access;
  error_log /var/log/nginx-hosts/www_noconformity.co.error error;

  error_page 400 401 402 403 404 500 502 503 504 /error.htm;
  location  /error.htm {
    internal;
  }
  # ------------------------------------------------------------------------
  location / {
    index index.html index.php index.htm;
    location ~* ^.*\.php$ {
      include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      }
  }
  # ------------------------------------------------------------------------
  # serve favicon
  location = /favicon.ico { 
    log_not_found off;
    access_log off;
  }
    # ------------------------------------------------------------------------
  # process robots.txt
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
    # ------------------------------------------------------------------------
  # serve static files directly
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
    access_log off;
    expires max;
  }
    # ------------------------------------------------------------------------
  # block access to .ht files
  location ~ /\.ht {
    deny  all;
  }
  # ------------------------------------------------------------------------
    # short cuts
    if ($uri ~* "/login") {
        rewrite ^/login(/.*)? /wp-admin$1;
    }
    # ------------------------------------------------------------------------
    # BEGIN W3TC Browser Cache
    gzip on;
    gzip_types text/css application/x-javascript text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
    location ~ \.(css|js)$ {
            expires 31536000s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
            expires 180s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=180, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
            expires 31536000s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    # END W3TC Browser Cache
    # BEGIN W3TC Skip 404 error handling by WordPress for static files
    if (-f $request_filename) {
            break;
    }
    if (-d $request_filename) {
            break;
    }
    if ($request_uri ~ "(robots\.txt|sitemap(_index|[0-9]+)?\.xml(\.gz)?)") {
            break;
    }
    if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
            return 404;
    }
    # END W3TC Skip 404 error handling by WordPress for static files
    # ------------------------------------------------------------------------
}

这是默认网站:

server {
  listen 80 default_server;
  server_name localhost;
  root /srv/www/www.default.site;
  access_log /var/log/nginx-hosts/default.access;
  error_log /var/log/nginx-hosts/default.error error;

  error_page 400 401 402 403 404 500 502 503 504 /error.htm;
  location  /error.htm {
    internal;
  }

  location / {
    index index.html index.php index.htm;
    location ~* ^.*\.php$ {
        if (!-f $document_root/$fastcgi_script_name){
            return 404;
      }
      include        fastcgi_params;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      fastcgi_intercept_errors on;
    }
  }
}

答案3

看起来你必须使用负面回顾

server {
    listen 80;
    server_name *.domain.com;
    ...

    if ($host ~* (?<!(dev|test|local))\.domain\.com) {
        rewrite ^ http://domain.com$request_uri permanent;
    }

}

答案4

找到杀手工具后:http://www.anilcetin.com/convert-apache-htaccess-to-nginx/我能够重建我的 nginx vhost 配置以使其正常工作,但是,我愿意接受建议和修改。这是一个多主机服务器,每个主机在站点中都有单独的主机文件

server {
  listen 80;
  server_name *.domain.com domain.com;
  root /srv/www/www.domain.com;
  access_log /srv/logs/www_domain.com.access;
  error_log /srv/logs/www_domain.com.error error;

  error_page 400 401 402 403 404 500 502 503 504 /error.htm;
  location  /error.htm {
    internal;
  }
  # ------------------------------------------------------------------------
  #RewriteCond %{HTTP_HOST} !^(dev|test|prod)\.domain\.com$ [NC]
  #RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com$
  #RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
  # all sub domains and www
    if ($http_host !~* "^(dev|test|prod)\.domain\.com$"){
        set $rule_0 1$rule_0;
    }
    if ($http_host ~ "^([^.]+)\.domain\.com$"){
        set $rule_0 2$rule_0;
    }
    if ($rule_0 = "21"){
        rewrite ^/(.*)$ http://domain.com/$1 permanent;
        break;
    }
  # ------------------------------------------------------------------------
  location / {
    index index.html index.php index.htm;
    location ~* ^.*\.php$ {
      include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      }
  }
  # ------------------------------------------------------------------------
  # serve favicon
  location = /favicon.ico { 
    log_not_found off;
    access_log off;
  }
    # ------------------------------------------------------------------------
  # process robots.txt
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
    # ------------------------------------------------------------------------
  # serve static files directly
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
    access_log off;
    expires max;
  }
    # ------------------------------------------------------------------------
  # block access to .ht files
  location ~ /\.ht {
    deny  all;
  }
  # ------------------------------------------------------------------------
    # short cuts
    if ($uri ~* "/login") {
        rewrite ^/login(/.*)? /wp-admin$1;
    }
    # ------------------------------------------------------------------------
    # BEGIN W3TC Browser Cache
    gzip on;
    gzip_types text/css application/x-javascript text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
    location ~ \.(css|js)$ {
            expires 31536000s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
            expires 180s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=180, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
            expires 31536000s;
            add_header Pragma "public";
            add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
            add_header X-Powered-By "W3 Total Cache/0.9.2.3";
    }
    # END W3TC Browser Cache
    # BEGIN W3TC Skip 404 error handling by WordPress for static files
    if (-f $request_filename) {
            break;
    }
    if (-d $request_filename) {
            break;
    }
    if ($request_uri ~ "(robots\.txt|sitemap(_index|[0-9]+)?\.xml(\.gz)?)") {
            break;
    }
    if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
            return 404;
    }
    # END W3TC Skip 404 error handling by WordPress for static files
    # ------------------------------------------------------------------------
}

默认服务器配置:

server {
  listen 80 default;
  server_name localhost;
  root /srv/www/www.default.site;
  access_log /srv/logs/localhost.access;
  error_log /srv/logs/localhost.error error;

  error_page 400 401 402 403 404 500 502 503 504 /error.htm;
  location  /error.htm {
    internal;
  }

  location / {
    index index.html index.php index.htm;
    location ~* ^.*\.php$ {
        if (!-f $document_root/$fastcgi_script_name){
            return 404;
      }
      include        fastcgi_params;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      fastcgi_intercept_errors on;
    }
  }
}

相关内容