Mod_Rewrite [L]和[R]之间的差异

时间:2011-08-16 19:53:59

标签: ajax apache wordpress mod-rewrite

我试图用“_excaped_fragment _ = / some / directory”将任何URL重写为“/ some / directory?ajax = 1”。下面的代码工作正常,但我想在没有重定向的情况下这样做。这是一个Wordpress网站。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    AddDefaultCharset UTF-8

    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
    RewriteRule (.*) %1?ajax=1 [L,R=301]

    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

如果我删除“R = 301”并且只留下“L”则它不起作用。我已经读过关于[L]从.htaccess不停止,但我实际上不希望它停止。我希望它只是更改URL然后通过常规的Wordpress重写。

有什么想法吗?如果您需要更多信息,请与我们联系。

编辑: 想要添加一个可回答的问题。为什么重定向工作,没有重定向不起作用? URL是否会在文件中向下或仅在最后一条规则上发生变化?

1 个答案:

答案 0 :(得分:0)

如果规则匹配,[L]将停止.htaccess中的任何进一步处理。

你写这个[L]的方式会这样做,但是你添加[R = 301]这是一个重定向。这将导致请求被发送回Apache中的“堆栈顶部”进行处理,就好像它是一个全新的请求,因为您正在进行重定向。但是,现在第二次通过你已经修改了URL,因为在进行切换之前处理了重写。

换句话说,[L]进行修改,然后说“好了,我们在这里完成了,现在退出正常的网页处理”。

[L,R = 301]进行了修改,然后说“我们完成了这件事,现在告诉他们下一行是我们做过重定向的行”。

[L,R = 301]的最后一部分触发了一整套新的逻辑来处理“嘿,我们只是重定向”规则。在您的情况下,导致整个重写序列从顶部开始处理,这次带有损坏的URL。