开发者

Rewrite url turning querystring into directory path and removing cgi script filename and path from url

开发者 https://www.devze.com 2023-02-12 09:43 出处:网络
I am trying to rewrite: repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=summary as repo.pointfree.net/remixbot/summary/ for example.

I am trying to rewrite: repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=summary

as repo.pointfree.net/remixbot/summary/ for example.

...but the url is apparently not being rewritten (when I visit repo.pointfree.net I get Error 403 Forbidden). Here is my .htaccess in the /home/public/werc/sites/repo.pointfree.net:

DirectoryIndex darcsweb/darcsweb.cgi
RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$
RewriteRule ^/darcsweb/darcsweb.cgi /darcsweb/%1/%2?

Here is the .htaccess in /home/public/:

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

I have a symlink in /home/public/werc/sites/repo.pointfree.net/ to /home/public/darcsweb named darcsweb

any help on this would be appreciated.

Thanks, Andreas

EDIT, After applying Andreas Gohr's suggestion and visiting repo.pointfree.net/remixbox/summary/ I got this in my log file and a my 404 page in the browser.

[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开发者_如何学Go.net/remixbot/summary/

and when I copy a favicon.ico to /home/public/ I get:

[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

I have also looked at the output of rewrite_log and there is no mention of darcsweb (short-circuit?):

172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] strip document_root prefix: /f5/pointfree/public/werc/bin/werc.cgi -> /werc/bin/werc.cgi
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (1) [perdir /f5/pointfree/public/] internal redirect with /werc/bin/werc.cgi [INTERNAL REDIRECT]
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] rewrite 'index.cgi' -> '/home/public/werc/bin/werc.cgi'
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] rewrite '/home/public/werc/bin/werc.cgi' -> '/f5/pointfree/public/werc/bin/werc.cgi'
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] strip document_root prefix: /f5/pointfree/public/werc/bin/werc.cgi -> /werc/bin/werc.cgi
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (1) [perdir /f5/pointfree/public/] internal redirect with /werc/bin/werc.cgi [INTERNAL REDIRECT]
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] rewrite 'index.pl' -> '/home/public/werc/bin/werc.cgi'
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] rewrite '/home/public/werc/bin/werc.cgi' -> '/f5/pointfree/public/werc/bin/werc.cgi'
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (2) [perdir /f5/pointfree/public/] strip document_root prefix: /f5/pointfree/public/werc/bin/werc.cgi -> /werc/bin/werc.cgi
172.17.0.131 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a43a058/subreq] (1) [perdir /f5/pointfree/public/] internal redirect with /werc/bin/werc.cgi [INTERNAL REDIRECT]
172.17.0.132 - - [21/Feb/2011:03:49:13 +0000] [repo.pointfree.net/sid#286c26a0][rid#2a5f0058/initial] (1) [perdir /f5/pointfree/public/] pass through /f5/pointfree/public/favicon.ico


It seems to me that you got the rewrite the wrong way round. If I understand you correctly you want to be able to use a URL like repo.pointfree.net/remixbot/summary/ to access what is really repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=summary

Your rewrite should look something like this then:

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

However this is only half of the thing. It will tell Apache where to look when such a request is posted, but it doesn't tell your application to create these nice URLs. Unless you want to hack the CGI (or it has an option for it) there is probably not much you can do.

Except... maybe a redirect would work:

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

This would cause a redirect to the clean URL everytime you click a link in your application...

PS: you might want to consider using http://blitiri.com.ar/p/darcsweb/ instead of the simple darcs CGI.


Why is there a semicolon where it should've been an ampersand in your URL?

repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot;a=summary

shouldn't the above be

repo.pointfree.net/darcsweb/darcsweb.cgi?r=remixbot&a=summary

Also, how about this RewriteRule?

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

As a debugging aid, try once by removing the RewriteCond to ensure that there's nothing wrong with it.

0

精彩评论

暂无评论...
验证码 换一张
取 消