代码之家  ›  专栏  ›  技术社区  ›  Andrew Ashbacher

Apache2+RewriteMap+Python-返回'NULL'时,apache挂起

  •  2
  • Andrew Ashbacher  · 技术社区  · 16 年前

    [已解决:请参阅下面的解决方案。]

    我在写一篇文章时遇到了问题 RewriteMap 程序(使用Python)。我有一个 指向Python脚本的指令,该脚本确定请求的URL是否需要重定向到其他位置。

    NULL (没有换行符),Apache挂起和后续HTTP请求实际上被忽略。

    错误日志显示没有错误。重写日志只显示一个 pass through redirect 如果成功,那么只有 通过 什么时候 由脚本返回。后续请求也仅显示 .

    stdout os.fdopen(sys.stdout.fileno(), 'w', 0) 将缓冲区长度设置为零没有帮助。

    任何帮助都将不胜感激。先谢谢你。

    [...]
    RewriteLock /tmp/apache_rewrite.lock
    

    /etc/apache2/可用站点/默认

    <VirtualHost *:80>
      [...]
      RewriteEngine on
      RewriteLogLevel 1
      RewriteLog /var/www/logs/rewrite.log
      RewriteMap remap prg:/var/www/remap.py
      [...]
    </VirtualHost>
    

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*_.*) /${remap:$1} [R=301]
    

    /var/www/remap.py

    #!/usr/bin/python
    
    import sys
    
    def getRedirect(str):
      new_url = None
      # if url needs to be redirected, put this value in new_url
      # otherwise new_url remains None
      return new_url
    
    while True:
      request = sys.stdin.readline().strip()
      response = getRedirect(request)
      if response:
        sys.stdout.write(response + '\n')
      else:
        sys.stdout.write('NULL')
      sys.stdout.flush()
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   chaos    15 年前

    您必须返回一个换行符,而不是“NULL”。

    Apache等待换行符来知道要重写的URL何时结束。如果脚本不发送换行符,Apache将永远等待。

    return ('NULL') return ('NULL\n')

    如果您不想在没有匹配项时重定向,我会:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond (${remap:$1}) !NULL
    RewriteRule (.*_.*) /%1 [R=301]
    

        2
  •  3
  •   Andrew Ashbacher    16 年前

    到目前为止,我提出的最佳解决方案是让RewriteMap脚本返回新的url或 '__NULL__\n' !__NULL__ .htaccess 文件如下。

    /var/www/webroot/.htaccess

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.+)$ - [E=REMAP_RESULT:${remap:$1},NS]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{ENV:REMAP_RESULT} !^__NULL__$
    RewriteRule ^(.+)$ /%{ENV:REMAP_RESULT} [R=301,L]
    

    /var/www/remap.py

    #!/usr/bin/python
    
    import sys
    
    def getRedirect(str):
      try:  # to prevent the script from dying on any errors
        new_url = str
        # if url needs to be redirected, put this value in new_url
        # otherwise new_url remains None
        if new_url == str: new_url = '__NULL__'
        return new_url
      except:
        return '__NULL__'
    
    while True:
      request = sys.stdin.readline().strip()
      response = getRedirect(request)
      sys.stdout.write(response + '\n')
      sys.stdout.flush()
    

    文科,你帮我弄清楚了。如果我有更多的工作经验 stackoverflow ^

    我希望这篇文章能帮助将来处理类似问题的人。

    安得烈