2011-12-01 56 views
1

我有一个外部应用程序(Gobi),它根据ISBN产生我们图书馆目录中记录的链接。应用程序可以被配置为使用我制定的URL,如:如何使用mod_rewrite重定向一个不存在的文件的请求?

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

它则应该与实际的ISBN替换$ISBN位,对于像这样的URL:

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

而且有时它实际上是这样做的。但其他时候,它把我可爱的干净的网址,并把它变成像这样(拆出到单独的线路为您提供方便):

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。漂亮的短URL由mod_rewrite通过以下方式处理:

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需要一个真实的文件,但我不知道。

对此提出建议?

+0

我想你已经提到过了,但我只是想仔细检查我的理解。你的意思是说,有时候需要干净的URL,并将其转换成长整齐的URL,其中'$ isbn'字面意思是全部小写? –

+0

@Susam是的,这是正确的。从字面上看,它有时会把所有小写字母都写出来。 –

回答

1

由于RewriteRule无法匹配给定的长URL,所以失败。因此,URL以不可重写方式通过,然后Apache恢复为在文件系统上查找名为“isbn/$ isbn”的目录或文件的默认行为。

您应该真的启用重写日志记录来查看日志中的这些问题。

RewriteEngine On 

在你的httpd.conf这样的事情或apache2.conf一起:您可以通过添加这对您的.htaccess的第一行启用日志记录

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。该查询不是路径的一部分。因此,您在中添加的.+正在导致该问题。

现在,我们该如何解决它?

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

+0

好的,修复它。不过,它让我很烦恼,'^ isbn/\ $ isbn'可以工作,'^ isbn/\ $ isbn。+'不会,因为我特别添加了“。+”以允许更长的URL。我已经尝试过'。*'结尾,而且工作正常 - 显然原始文件失败了,因为'。+'意味着URL必须至少比实际字符长一个字符。男孩,mod_rewrite有时可能是一种痛苦。谢谢! –

相关问题