Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mod rewrite 如何使用mod_rewrite重定向对不存在文件的请求?_Mod Rewrite - Fatal编程技术网

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

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错误,因为我

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

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必须至少比实际长度长一个字符。天啊,修改有时候会很痛苦。谢谢