Mod rewrite 如何使用mod_rewrite重定向对不存在文件的请求?
我有一个外部应用程序(Gobi),它根据ISBN生成指向我们图书馆目录中记录的链接。应用程序可以配置为使用我设计的URL,例如:Mod rewrite 如何使用mod_rewrite重定向对不存在文件的请求?,mod-rewrite,Mod Rewrite,我有一个外部应用程序(Gobi),它根据ISBN生成指向我们图书馆目录中记录的链接。应用程序可以配置为使用我设计的URL,例如: http://library.example.edu/isbn/$ISBN 然后它应该用实际的ISBN替换$ISBN位,对于这样的URL: http://library.example.edu/isbn/9780262516778 有时它确实做到了。但其他时候,它会将我可爱的干净URL转换成如下内容(为了方便起见,分成几行): 这些链接随后会出现404错误,因为我
http://library.example.edu/isbn/$ISBN
然后它应该用实际的ISBN替换$ISBN
位,对于这样的URL:
http://library.example.edu/isbn/9780262516778
有时它确实做到了。但其他时候,它会将我可爱的干净URL转换成如下内容(为了方便起见,分成几行):
这些链接随后会出现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]
此操作失败,生成错误消息文件不存在:/var/www/isbn
。我想现在发生的是重写规则需要一个真正的文件,但我不确定
建议?它失败,因为重写规则与给定的长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
。查询不是路径的一部分。因此,您在regex^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
它失败了,因为重写规则无法匹配给定的长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
。查询不是路径的一部分。因此,您在regex^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
我想你已经提到了,但我只是想再次检查一下我的理解。你的意思是,有时它会将你的干净URL转换成一个长而混乱的URL,其中“$isbn”以小写字母出现?@Susam是的,这是正确的。有时,它把isbn美元按字面意思放在所有小写字母中。我想你已经提到了,但我只是想再次核实我的理解。你的意思是,有时它会将你的干净URL转换成一个长而混乱的URL,其中“$isbn”以小写字母出现?@Susam是的,这是正确的。有时它会把isbn美元按字面意思放在所有小写字母中。好吧,这就解决了问题。尽管如此,^isbn/\$isbn
有效,而^isbn/\$isbn.+
无效,这让我很恼火,因为我添加了+
是为了允许更长的URL。我最后尝试了*
,但效果很好——很明显,原始版本失败了,因为+
意味着URL必须至少比实际长度长一个字符。天啊,修改有时候会很痛苦。谢谢好的,这就解决了。尽管如此,^isbn/\$isbn
有效,而^isbn/\$isbn.+
无效,这让我很恼火,因为我添加了+
是为了允许更长的URL。我最后尝试了*
,但效果很好——很明显,原始版本失败了,因为+
意味着URL必须至少比实际长度长一个字符。天啊,修改有时候会很痛苦。谢谢