[已解决:请参阅下面的解决方案。]
我在编写RewriteMap
程序时遇到问题(使用 Python)。我有一个RewriteMap
指向 Python 脚本的指令,该脚本确定请求的 URL 是否需要重定向到其他地方。
当脚本输出由换行符终止的字符串时,Apache 会相应地重定向。但是,当脚本输出NULL
(没有换行符)时,Apache 挂起并且随后的 HTTP 请求被有效地忽略。
错误日志显示没有错误。重写日志仅在成功时显示 apass through
后跟 a redirect
,然后仅pass through
在NULL
脚本返回时显示。随后的请求也只显示pass through
.
此外,替换stdout
为os.fdopen(sys.stdout.fileno(), 'w', 0)
将缓冲区长度设置为零也无济于事。
任何帮助将不胜感激。先感谢您。
/etc/apache2/httpd.conf
[...]
RewriteLock /tmp/apache_rewrite.lock
/etc/apache2/sites-available/default
<VirtualHost *:80>
[...]
RewriteEngine on
RewriteLogLevel 1
RewriteLog /var/www/logs/rewrite.log
RewriteMap remap prg:/var/www/remap.py
[...]
</VirtualHost>
/var/www/webroot/.htaccess
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()