2009-06-24 99 views
7

假设我有一个重写需要将url传递给一个PHP函数并检索一个值以告知新目标应该是什么?有没有办法做到这一点?从.htaccess运行PHP代码?

谢谢。

UPDATE:

由于到目前为止guys..I我仍然有麻烦,但我会告诉你我的代码:

的.htaccess

#I got the file path by echoing DOCUMENT_ROOT and added the rest. 
RewriteMap fixurl prg:/var/www/vhosts/mydomain.com/httpsdocs/domain_prototype/code_base/url_handler.php 

RewriteEngine On 
RewriteRule (.*) ${fixurl:$1} [PT] 

PHP:

set_time_limit(0); # forever program! 
$keyboard = fopen("php://stdin","r"); 
while (1) { 
     $line = trim(fgets($keyboard)); 
     print "www.google.com\n"; # <-- just test to see if working. 
} 

但是我得到一个500内部服务器错误我不确定在我的.htaccess或我的PHP中是否有错误?

回答

11

有一种叫做RewriteMap的东西。

您可以调用一个可执行脚本,该脚本将返回要重写的URL。

检查本文的详细信息和示例(在Perl,但完全适用于任何其他语言):需要注意的地方

http://www.onlamp.com/pub/a/apache/2005/04/28/apacheckbk.html

摘要:

  • 必须运行一个读取STDIN循环(即,在收到URL后不要退出)
  • 必须打印URL才能重写为带有换行符
  • 必须是由运行Apache的用户读取和执行为

这是创建地图

RewriteMap fixurl prg:/usr/local/scripts/fixit.php 

的方式,现在我们可以在一个重写规则使用它:

RewriteEngine On 
RewriteRule (.*) ${fixurl:$1} 

编辑:关于内部服务器错误。最可能的原因是Gumbo提到的,遗憾的是,RewriteMap不能在.htaccess中使用。您可以在.htaccess的RewriteRule中使用它,但只能在服务器配置或虚拟主机配置中创建它。为了确定,请检查错误日志。

所以,唯一的PHP/.htaccess解决方案就是将所有内容都重写到某个PHP程序,该程序使用位置标题进行检查和重定向。喜欢的东西:

RewriteRule (.*) proxy.php?args=$1 [QSA] 

然后,在proxy.php

<?php 
     $url = get_proper_destination($QUERY_STRING); #args will have the URI path, 
                #and, via QSA you will have 
                #the original query string 
     header("Location: $url"); 
?> 
2

我会做的就是将URL传递到PHP页面,然后做使用PHP头选项最终重定向。

header("Location: new-page.php"); 

如果你不希望它重定向,你也可以做一个包括你想要的页面。我发现这比使用RewriteMap更灵活一些。

希望这会有所帮助!