2014-10-13 137 views
1

我有一個基於gae的應用程序。我用webapp2框架來使用python。我需要將301重定向從www.my-crazy-domain.commy-crazy.domain.com這樣可以消除搜索結果中的www和非www雙打。Google App Engine Python Webapp2 301從www重定向到非www域名

有沒有人有現成的解決方案?謝謝你的幫助!

+0

我做了這個把戲。解決方案是[這裏](http://pastebin.com/kcFb3Jqf)。 config.host_full包含沒有www的我的主域。 解決方案是檢查基本控制器中的請求,並在域不同時進行重定向。 – userlond

+1

既然您在任何人回答之前找到答案,甚至可以刪除問題。 – Lipis

+2

或自己回答並接受它! –

回答

5

我就這樣做了。

class BaseController(webapp2.RequestHandler): 
    """ 
    Base controller, all contollers in my cms extends it 
    """ 

    def initialize(self, request, response): 
     super(BaseController, self).initialize(request, response) 
     if request.host_url != config.host_full: 
      # get request params without domain 
      url = request.url.replace(request.host_url, '') 
      return self.redirect(config.host_full+url, permanent=True) 

config.host_full包含我的主域名沒有www。解決方案是檢查基本控制器中的請求,並在域不同時進行重定向。

+2

感謝您發佈解決方案(而不是像其他人說的那樣刪除它),這對我有幫助! :) –

0

我修改了一下@userlond回答不要求額外的配置價值,而不是我在使用正則表達式:

import re 
import webapp2 


class RequestHandler(webapp2.RequestHandler): 
    def initialize(self, request, response): 
     super(RequestHandler, self).initialize(request, response) 
     match = re.match('^(http[s]?://)www\.(.*)', request.url) 
     if match: 
      self.redirect(match.group(1) + match.group(2), permanent=True) 
0

也許這是使用默認的get()請求一個簡單的方法。如果URL可能在查詢參數等地方有www,請加強正則表達式。

import re 
import webapp2 


class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     url = self.request.url 

     if ('www.' in url): 
      url = re.sub('www.', '', url) 
      return self.redirect(url, permanent=True) 

     self.response.write('No need to redirect') 

app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=False) 
0

解決方案不需要修改主應用程序,也可以使用靜態文件來創建一個在www上運行的服務。對於創建以下文件:

www.yaml

runtime: python27 
api_version: 1 
threadsafe: yes 
service: www 

handlers: 
- url: /.* 
    script: redirectwww.app 

redirectwww.py

import webapp2 

class RedirectWWW(webapp2.RequestHandler): 
    def get(self): 
    self.redirect('https://example.com' + self.request.path) 

app = webapp2.WSGIApplication([ 
    ('.*', RedirectWWW), 
]) 

dipatch.yaml

dispatch: 
    - url: "www.example.com/*" 
    service: www 

然後用gcloud app deploy www.yaml dispatch.yaml部署。