【问题标题】:Can you continue to match htaccess patterns after 301 redirect?301重定向后还能继续匹配htaccess模式吗?
【发布时间】:2013-06-04 12:56:33
【问题描述】:

我的 public_html 中的 .htaccess 文件有:

RewriteEngine on
RewriteRule ^testfolder/(.*)$ /$1 [R=301,L,NC]
RewriteRule ^(.*)$ testfolder/$1

根据我用来测试输出的http://htaccess.madewithlove.be/

当我输入 http://www.mydomain.com/testfolder/aaa/bbb 我得到:

This rule was met, the new url is http://www.mydomain.com/aaa/bbb
Test are stopped, because of the R in your RewriteRule options. A redirect will be made with status code 301

有没有办法执行 301 重定向以使浏览器栏中的网址“更漂亮” 同时继续尝试在 htacess 文件中进一步匹配模式?

我在 www.mydomain.com/testfolder 中有我的 codeigniter 项目。我的第一条规则:

RewriteRule ^testfolder/(.*)$ /$1 [R=301,L,NC] 

是重写任何对控制器的导航栏请求,其形式为:www.mydomain.com/testfolder/controller/method 到 www.mydomain.com/testfolder/controller/method。第二条规则是让任何人 www.mydomain.com/controller/method 将使用它在内部变成 www.mydomain.com/testfolder/controller/method

提前谢谢你,

比尔

附录 - 我当前的 .htaccess 文件:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+b1/(.*)\s [NC]
RewriteRule ^ /$1 [R=302,L]

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(.*)$ /b1/$1 [L]

【问题讨论】:

  • 不要使用 R=301,它们被缓存在您无法控制的客户端浏览器上。仅使用 R(默认为 302)

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

首先你的规则有缺陷,肯定会导致无限循环

原因是第一条规则在外部将/testfolder/aaa/bbb 重定向到/aaa/bbb

现在,在重定向之后,第二条规则也将启动,因为您只是在那里匹配 .*,这将在内部转发/testfolder/aaa/bbb/,并且该规则将导致第一条规则启动一次再次,这将导致无限循环。

不知道您的意图,但您可以使用此代码来避免循环:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+b1/([^\s]+)\s [NC]
RewriteRule ^ /$1 [R=302,L]

RewriteRule ^(.*)$ /b1/$1 [L,P]

一旦您确认它工作正常,请将R=302 替换为R=301。在测试你的 mod_rewrite 规则时避免使用R=301(永久重定向)。

【讨论】:

  • 我试过了,但导航栏请求生成的浏览器栏 URL 没有从 /testfolder/aaa/bbb 重写为 /aaa/bbb。我添加了更多细节
  • 用 '/controller/method` 替换 /aaa/bbb,这应该仍然有效。但是,您应该在您的问题中发布您最新的完整 .htacess,以便我可以进一步调查。
  • 我已经添加了当前 htacess 的附录。还有更多关于我想要做什么的解释,请参阅stackoverflow.com/questions/16875945/…。谢谢 - 比尔
  • 很可能是 CI 框架在做自己的内部重定向。我正在做一个编辑,看看是否适合你。
  • “很可能是 CI 框架在做自己的内部重定向。” - 我查看了项目中的其他 htaccess 文件。在 application/cache/.htacess 下有 1 行“deny from all”这有帮助吗?
【解决方案2】:

没有。一旦客户端被重定向,就会出现一个新的请求,并使用新的 URL 重新开始重写。

【讨论】:

  • 那么 .htaccess 文件在重写后会重新开始吗?
  • 假设 URL 仍然指向它,当然。
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2012-08-18
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多