2016-12-04 79 views
2

.htaccess,/mydir/中应该使用什么RewriteRule到HTTP 302将每个请求重定向到http://www.example.com/mydir/output重写规则.htaccess中的模式否定会导致太多的重定向

/mydir/.htaccess当前的内容:

RewriteEngine On 
RewriteBase "/mydir/" 
RewriteRule !"^output$" "output" [R] 

输入网址:

http://www.example.com/mydir/input1

http://www.example.com/mydir/input2

http://www.example.com/mydir/input3

预期输出:

http://www.example.com/mydir/output

http://www.example.com/mydir/output

http://www.example.com/mydir/output

实际产出:

ERR_TOO_MANY_REDIRECTS

ERR_TOO_MANY_REDIRECTS

ERR_TOO_MANY_REDIRECTS

回答

-1

要检查如果您的网址是不是有output启动,它总是如此。更改规则:

RewriteEngine On 
RewriteRule !^/mydir/output$ /mydir/output [R] 
+0

谢谢,但不幸它不起作用。现在输出仍然是'ERR_TOO_MANY_REDIRECTS'。也许正因为如此,但我不确定:'在比较之前(直到并包括尾部斜线),定义规则的目录路径从当前映射的文件系统路径中剥离。这个每个目录前缀剥离的最终结果是,在这个上下文中的规则只匹配当前映射的文件系统路径中“规则”被定义的那部分。“来源:[什么是匹配的?](http:// httpd.apache.org/docs/current/mod/mod_rewrite.html#what_is_matched) –

+0

如果Pattern是'“^ output $”'(不带'!'),则按照预期匹配以下URL:'http:// www.example.com/MYDIR/output'。没有其他事情与预期一致。所以,当相同的模式被否定时,我猜它应该**不匹配提到的URL,但**匹配**其他所有内容。但它似乎匹配所有内容,因为重写循环(?)表明所提到的URL也匹配。 –

+0

你说得对。加倍检查。回答更新,你可以再次检查:) – Dekel

0
RewriteEngine On 
RewriteBase "/mydir/" 
RewriteRule "^output$" "-" [L] 
RewriteRule ".*" "output" [R] 
# Further rules are not processed. 

我不知道为什么否定不行,但原来的重写规则可以通过上面这2所取代。这样,如果URL已经是预期的输出(参见​​替换和L flag),第一个RewriteRule将停止整个重写过程,以避免重定向循环。否则,所有内容都会被第二个RewriteRule重写为预期的输出URL。如果应该避免停止整个重写过程,则可以仅跳过无条件(第二次)重写规则,因此每个进一步的规则都被处理。为了实现这一点,使用S flag如下:

RewriteEngine On 
RewriteBase "/mydir/" 
RewriteRule "^output$" "-" [S=1] 
RewriteRule ".*" "output" [R] 
# Further rules are processed as well. 
0

你错过了你的规则的L标志,但它过于宽泛;它只应该匹配发送到服务器的实际URL。我怀疑这个请求的最终目的地是一个名为output的无扩展名文件,但这是你的规则坚持的。试试这个:

RewriteEngine On 
RewriteBase /mydir/ 
RewriteCond %{THE_REQUEST} !^\S++\s++/mydir/output\s 
RewriteRule^output [NS,R,L] 
# rules after this should now be processed