【问题标题】:Very advanced .htaccess非常高级的.htaccess
【发布时间】:2012-04-28 03:54:03
【问题描述】:

好的,我环顾四周,似乎找不到答案。

现在我不是要求你只给我一段代码,然后说“这就是修复”,我希望你解释一下你是如何做到的,你想出了什么等等。我真的很想了解更多,而学习的唯一方法就是通过例子。

现在我需要做的是:

目前我的博客(word press go figure,因为他们拥有世界)位于根目录。所以我的帖子看起来像:http://localhost/hello-world。只是一个例子。

但是,我刚刚扩展了我的网站,使用 Code Igniter 自定义构建的 PHP 脚本。我需要将 Code Igniter 脚本放在根目录下,并将博客移动到 /main/ 或 /blog/。我不想摆脱我的博客,但我不希望谷歌不得不重新索引每一篇博文,或者让谷歌导致错误的帖子网址。更重要的是,我不想坐在这里好几个小时,为每一篇博文(有数百篇)创建重定向网址。

现在我需要重定向为 301 重定向。

这是我遇到的问题。

我需要在 .htaccess 中有这个:

 RewriteEngine on
 RewriteCond $1 !^(index\.php|admin|css|img|js|main|favicon.ico)
 RewriteRule ^(.*)$ index.php/$1 [L]

这删除了丑陋的 localhost/index.php/controller/controller-function/

但我需要让我的 .htaccess 重定向 / 上的所有内容,而不是我已经拥有的预设网址。

我通过 Code Igniter 获得的 Preset url 参数是:

/details/
/register/
/city/
/search_process/
/login/
/logout-success/
/login-success/
/logout/
/login/
/manage/
/panel/

所以本质上..

localhost/hello-world/ 必须 301 重定向到 localhost/main/hello-world

localhost/(any-of-the-above)/ 必须不重定向到 /main/ 或 /blog/

另外,如果您在当前的 .htaccess 中注意到,我已经允许某些内容,例如 /admin/ /css/ /img/ /js/(/main/ 显然是博客)和 favicon.ico(因为它看起来很棒)

请教我! (你多久听到一次?:P)

劳伦斯·切罗内功劳归功!

他原本给我的答案,从那时到现在我想我第一次打错了,不小心丢了代码,第二次复制/粘贴后就不行了(因为第一次我实际上是打出来学习的)。

所以这里使用修改后的工作解决方案。我完全信任 Lawrence Cherone(这个问题的答案已被接受的人),因为他帮助我解决了这个问题,最终如果没有他,我无法获得这个可行的解决方案。再次感谢老兄!

RewriteEngine on
RewriteCond $1 !(panel|manage)
RewriteRule ^(.*)$ http://localhost/choosefitness/main/$1 [R=301,L]

RewriteEngine on
RewriteCond $1 !^(index\.php|admin|css|img|js|less|favicon.ico)
RewriteRule ^(.*)$ index.php/$1 [L]

这只是说明,只要第一个参数 http://localhost/choosefitness/first-argument 不是 /panel 或 /manage。它应该 301 重定向到 /main/(必须为 301 重定向提供完整的 URL,而不仅仅是 main/$1)

然后它声明在 admin css img js lss 或 favicon.ico 上发出的任何请求都应该被忽略。 else 应该在 index.php 上进行(这会从 code igniter 中的 url 中删除 index.php)

我不知道它为什么起作用,我只知道它起作用。但是我还没有完全测试它,但我相信能够在没有重定向的情况下访问 /css,您必须将 |css 添加到第一个 RewriteCond。但是,服务器无需这样做即可访问 css 文件。

【问题讨论】:

  • 注意。在第一个 RewriteCond 中没有调节的任何 URL 都不起作用,将被发送到 /main/。所以localhost/choosefitness/css 将不起作用,因为它不在第一个 RewriteCond 中。其次,如果 URL 参数也不在第二个条件中,它不会被忽略,并且会针对 index.php 执行。因此,在第二个 RewriteCond 中没有 |css,但在第一个 RewriteCond 中拥有它,就像localhost/choosefitness/index.php/css 一样,并充当 Code Igniter 参数。

标签: php .htaccess http-status-code-301


【解决方案1】:

这是未经测试的,很确定index.php/$1/$2 是错误的,但是...您可以包含一个与您的 CI 规则匹配的规则,然后传递给 CI 控制器,如果发现不匹配,则重写您的 /blog/ url .也不要忘记逃避。在favicon\.ico 部分。

RewriteEngine on
RewriteCond $1 !^(index\.php|admin|css|img|js|main|favicon\.ico)

RewriteRule ^(details|register|city|search_process|login|logout-success|login-success|logout|login|manage|panel)/(.*)$ index.php/$1/$2 [L]
RewriteRule ^(.*)$ /blog/$1 [L]

编辑:如果您的参数在前面,则将规则切换为如下内容:

RewriteRule ^(.*)/(details|register|city|search_process|login|logout-success|login-success|logout|login|manage|panel)$ index.php/$1/$2 [L]

【讨论】:

  • 确定关闭。这就是我所拥有的: RewriteRule ^(details|register|city|search_process|login|logout-success|login-success|logout|login|manage|panel)(.*)$ ./index.php/$1 [L]这就是我改变的。它现在在 /blog/index.php/panel 上发出请求
  • 未找到 在此服务器上未找到请求的 URL /blog/index.php/panel。
  • 您尝试使用什么 url:./city/bla 之类的东西会达到 CI 规则,而 ./something/bla 会达到博客 url,看起来您正在尝试 ./index.php/panel 与您需要的不匹配使用./panel/ 忘记index.php 部分。
  • 当我转到localhost/choosefitness/panel 时,它说:未找到 在此服务器上未找到请求的 URL /blog/panel。如果我转到相同的 url 但尾部斜杠面板/它说:未找到请求的 URL /blog/index.php/panel/ 在此服务器上找不到。
  • np,未来参考。一个方便的书签网站,用 mod_rewrite 解释了很多很酷的东西:corz.org/serv/tricks/htaccess2.php
猜你喜欢
  • 2016-06-21
  • 2015-06-09
  • 2013-06-19
  • 2012-06-25
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2014-07-24
相关资源
最近更新 更多