如何使用mod_rewrite重定向不存在的文件的请求?

时间:2011-12-01 16:59:36

标签: mod-rewrite

我有一个外部应用程序(Gobi),它根据ISBN生成我们图书馆目录中记录的链接。可以将应用程序配置为使用我设计的URL,例如:

http://library.example.edu/isbn/$ISBN

然后它应该用实际的ISBN替换$ISBN位,对于这样的URL:

http://library.example.edu/isbn/9780262516778

有时它实际上是这样做的。但其他时候,它需要我可爱的干净的URL并将其变成这样的东西(为方便起见,分成不同的行):

http://library.example.edu/isbn/$isbn
    ?sid=ybp.com:GOBI2
    &genre=book
    &title=EVOCATIVE+OBJECTS%253a+THINGS+WE+THINK+WITH
    &isbn=9780262516778
    &date=2007
    &volume0
    &stitle=

这些链接因404错误而失败,因为我们的服务器上没有名为isbn/$isbn的文件。使用以下内容由mod_rewrite处理好的短URL:

RewriteRule ^isbn/([0-9]+)/?$  http://catalog.library.example.edu/vufind/Search/Home?lookfor=$1&type=isn&library=XMPLE    [NC,R=301,L]

现在我需要提出第二条规则来处理丑陋的长变种。到目前为止,我已经想出了这个:

RewriteCond %{QUERY_STRING} ^sid=ybp\.com:GOBI2&genre=book&title=(.*)&isbn=([0-9]*)&date=([0-9]*)&volume0&stitle=$
RewriteRule ^isbn/\$isbn.+  http://library.und.edu/test.php?lookfor=%2&type=isn&library=UNDAL    [NC,R=301,L]

此操作失败,生成错误消息File does not exist: /var/www/isbn。我认为正在发生的事情是RewriteRule需要一个真实的文件,但我不确定。

建议?

1 个答案:

答案 0 :(得分:1)

失败,因为RewriteRule无法匹配给定的长URL。因此,URL以不可重写的方式传递,然后Apache回退到在文件系统上查找名为“isbn / $ isbn”的目录或文件的默认行为。

您应该真正启用重写日志记录,以便在日志中查看这些问题。您可以通过将其添加到.htaccess的第一行来启用日志记录:

RewriteEngine On

以及httpd.conf或apache2.conf中的类似内容:

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 9

执行此操作时,您应该会看到rewrite.log文件中的内容:

127.0.0.1 - - [01/Dec/2011:23:00:13 +051800] [susam/sid#7fa14866fe98][rid#7fa1484d80a0/initial] (3) [perdir /home/susam/www/susam.in/] add path info postfix: /home/susam/www/susam.in/isbn -> /home/susam/www/susam.in/isbn/$isbn
127.0.0.1 - - [01/Dec/2011:23:00:13 +051800] [susam/sid#7fa14866fe98][rid#7fa1484d80a0/initial] (3) [perdir /home/susam/www/susam.in/] strip per-dir prefix: /home/susam/www/susam.in/isbn/$isbn -> isbn/$isbn
127.0.0.1 - - [01/Dec/2011:23:00:13 +051800] [susam/sid#7fa14866fe98][rid#7fa1484d80a0/initial] (3) [perdir /home/susam/www/susam.in/] applying pattern '^isbn/\$isbn.+' to uri 'isbn/$isbn'
127.0.0.1 - - [01/Dec/2011:23:00:13 +051800] [susam/sid#7fa14866fe98][rid#7fa1484d80a0/initial] (1) [perdir /home/susam/www/susam.in/] pass through /home/susam/www/susam.in/isbn

注意最后一行。路径只是isbn/$isbn。查询不是路径的一部分。因此,您在正则表达式.+中添加的^isbn/\$isbn.+导致了问题。

现在,我们该如何解决?

RewriteCond %{QUERY_STRING} ^sid=ybp\.com:GOBI2&genre=book&title=(.*)&isbn=([0-9]*)&date=([0-9]*)&volume0&stitle=$
RewriteRule ^isbn/\$isbn http://library.und.edu/test.php?lookfor=%2&type=isn&library=UNDAL    [NC,R=301,L]

请注意,这次正则表达式只是^isbn/\$isbn