gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:11:56 25 4
gpt4 key购买 nike

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

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

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

错误日志显示没有错误。重写日志仅显示 pass through 后跟 redirect 成功时,然后只有 pass throughNULL 是由脚本返回。后续请求也只显示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()

最佳答案

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

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

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

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

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

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

关于python - Apache2 + RewriteMap + Python——返回 'NULL' 时,apache 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1580780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com