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

And*_*her 2 python apache rewrite apache2

[求助:见下面的解决方案.]

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

当脚本输出由换行符终止的字符串时,Apache会相应地重定向.但是,当脚本输出NULL(没有换行符)时,Apache挂起并且后续HTTP请求被有效忽略.

错误日志显示没有错误.重写日志只显示pass through后跟一个redirect成功时,则只有pass throughNULL由脚本返回.后续请求也只显示pass through.

此外,更换stdoutos.fdopen(sys.stdout.fileno(), 'w', 0)对缓冲区长度设置为零没有帮助.

任何帮助将不胜感激.先感谢您.

/etc/apache2/httpd.conf

[...]
RewriteLock /tmp/apache_rewrite.lock
Run Code Online (Sandbox Code Playgroud)

在/ etc/apache2的/网站可用/默认

<VirtualHost *:80>
  [...]
  RewriteEngine on
  RewriteLogLevel 1
  RewriteLog /var/www/logs/rewrite.log
  RewriteMap remap prg:/var/www/remap.py
  [...]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

/var/www/webroot/.htaccess

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

/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()
Run Code Online (Sandbox Code Playgroud)

Vin*_*vic 6

你必须返回一个换行符,而不是'NULL'.

Apache等待换行符以知道要重写的URL何时结束.如果您的脚本没有发送新行,Apache将永远等待.

所以只需更改return ('NULL')return ('NULL\n'),然后将重定向到/.如果您不希望发生这种情况,请让程序在地图中没有匹配时返回您想要的URL.

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

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

在RewriteCond中使用匹配(当然,这也适用于NULL).但考虑到你的问题,这看起来是正确的解决方案.