And*_*her 2 python apache rewrite apache2
[求助:见下面的解决方案.]
我在编写RewriteMap程序时遇到问题(使用Python).我有一个RewriteMap指向Python脚本的指令,该脚本确定所请求的URL是否需要重定向到其他位置.
当脚本输出由换行符终止的字符串时,Apache会相应地重定向.但是,当脚本输出NULL(没有换行符)时,Apache挂起并且后续HTTP请求被有效忽略.
错误日志显示没有错误.重写日志只显示pass through后跟一个redirect成功时,则只有pass through当NULL由脚本返回.后续请求也只显示pass through.
此外,更换stdout与os.fdopen(sys.stdout.fileno(), 'w', 0)对缓冲区长度设置为零没有帮助.
任何帮助将不胜感激.先感谢您.
[...]
RewriteLock /tmp/apache_rewrite.lock
Run Code Online (Sandbox Code Playgroud)
<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)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*_.*) /${remap:$1} [R=301]
Run Code Online (Sandbox Code Playgroud)
#!/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)
你必须返回一个换行符,而不是'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).但考虑到你的问题,这看起来是正确的解决方案.
| 归档时间: |
|
| 查看次数: |
2592 次 |
| 最近记录: |