我有一个外部应用程序(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需要一个真实的文件,但我不确定。
建议?
答案 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
。