Apache 重写url将查询字符串转换为目录路径并从url中删除cgi脚本文件名和路径

Apache 重写url将查询字符串转换为目录路径并从url中删除cgi脚本文件名和路径,apache,.htaccess,mod-rewrite,apache2,darcs,Apache,.htaccess,Mod Rewrite,Apache2,Darcs,我试图重写:repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=摘要 例如,repo.pointfree.net/remixbot/summary/ …但是url显然没有被重写(当我访问repo.pointfree.net时,我得到错误403禁止)。这是我在/home/public/werc/sites/repo.pointfree.net中的.htaccess: DirectoryIndex darcsweb/darcsweb.cgi R

我试图重写:
repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=摘要

例如,
repo.pointfree.net/remixbot/summary/

…但是url显然没有被重写(当我访问repo.pointfree.net时,我得到
错误403禁止
)。这是我在
/home/public/werc/sites/repo.pointfree.net中的
.htaccess

DirectoryIndex darcsweb/darcsweb.cgi
RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$
RewriteRule ^/darcsweb/darcsweb.cgi /darcsweb/%1/%2?
以下是
/home/public/
中的
.htaccess

Options +ExecCGI
AddHandler cgi-script .cgi
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{HTTP_HOST} !^repo\.pointfree\.net$
RewriteRule (.*) /home/public/werc/sites/%{HTTP_HOST}/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /home/public/werc/bin/werc.cgi

RewriteRule /werc.cgi /f5/pointfree/public/werc/bin/werc.cgi
ErrorDocument 404 /werc.cgi
我在/home/public/werc/sites/repo.pointfree.net/to/home/public/darcsweb中有一个名为darcsweb的符号链接

在此方面的任何帮助都将不胜感激

谢谢, 安德烈亚斯

编辑,在应用Andreas Gohr的建议并访问repo.pointfree.net/remixbox/summary/之后,我在日志文件中找到了这个,并在浏览器中找到了我的404页面

[Mon Feb 21 00:15:28 2011] [error] [client 172.17.0.144] NOT FOUND: repo.pointfree.net/favicon.ico - http://repo.pointfree.net/remixbot/summary/ - Uzbl (Webkit 1.2) (Linux i686 [i686]), referer: http://repo.pointfree.net/remixbot/summary/
[Mon Feb 21 00:15:28 2011] [error] [client 172.17.0.144] repo.pointfree.net/favicon.ico - Uzbl (Webkit 1.2) (Linux i686 [i686]) - GET - tpl_handler lib/404.tpl - lib/default_master.tpl, referer: http://repo.pointfree.net/remixbot/summary/
当我将favicon.ico复制到/home/public/时,我得到:

[Mon Feb 21 00:17:46 2011] [error] [client 172.17.0.131] NOT FOUND: repo.pointfree.net/remixbot/summary/ -  - Uzbl (Webkit 1.2) (Linux i686 [i686])
[Mon Feb 21 00:17:47 2011] [error] [client 172.17.0.131] repo.pointfree.net/remixbot/summary/ - Uzbl (Webkit 1.2) (Linux i686 [i686]) - GET - tpl_handler lib/404.tpl - lib/default_master.tpl
我还查看了rewrite_log的输出,但没有提到darcsweb(短路?):


为什么在你的URL中有一个分号应该是一个符号

repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=summary
难道上述情况不应该发生吗

repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot&a=summary
还有,这个规则怎么样

RewriteRule ^darcsweb/darcsweb.cgi?r=(.+)&a=(.+)$ /$1/$2/

作为一种调试帮助,请尝试删除“重写条件”以确保它没有问题。

在我看来,您的“重写”操作是错误的。如果我理解正确,您希望能够使用repo.pointfree.net/remixbot/summary/这样的URL访问真正的repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=摘要

您的重写应该如下所示:

RewriteRule ^\/(.+?)\/(.+?)\/?   /darcsweb/darcsweb.cgi?r=$1;a=$2 [QSA]
然而,这只是事情的一半。当发布这样的请求时,它会告诉Apache在哪里查找,但不会告诉您的应用程序创建这些漂亮的URL。除非你想破解CGI(或者它有一个选项),否则你可能无能为力

除了。。。也许重定向会起作用:

RewriteRule ^\/(.+?)\/(.+?)\/?   /darcsweb/darcsweb.cgi?r=$1;a=$2 [QSA,L]
RewriteRule ^\/darcsweb\/darcsweb.cgi?r=(.+?);a=(.+?) /$1/$2/ [QSA,R]
这将导致每次单击应用程序中的链接时重定向到干净的URL

PS:您可能想考虑使用简单的DARCS CGI。< /P>

RewriteRule ^\/(.+?)\/(.+?)\/?   /darcsweb/darcsweb.cgi?r=$1;a=$2 [QSA,L]
RewriteRule ^\/darcsweb\/darcsweb.cgi?r=(.+?);a=(.+?) /$1/$2/ [QSA,R]