【问题标题】:htaccess rewrite rule ends in an infinite loophtaccess 重写规则以无限循环结束
【发布时间】:2014-08-06 16:53:18
【问题描述】:

我想永久重定向

www.example.com/event/title-goes-herewww.example.com/event/jazz/title-goes-here

在我的 htaccess 文件中使用正则表达式。

我目前有:

RewriteEngine on
RewriteRule ^event/(.*)$ http://www.example.com/event/jazz/$1 [R=301,L]

但这会导致无限循环(它转到example.com/event/jazz/jazz/jazz/jazz 等),因为 /event/ 部分是相同的。

我如何使用重写规则进行重写,并且考虑到人们可以转到example.com/event/title-goes-hereexample.com/event/title-goes-here/(因此带有斜杠),同时仍然正确地进行重定向.

编辑/更新

根据 anubhava 的回答,我的完整 .htaccess 文件现在看起来像这样(忘了提到 index.php 上也有重写):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
RewriteRule ^event/([^/]+)/?$ /event/jazz/$1 [R=301,L,NC,NE]

还忘了提到我正在使用 CodeIgniter 并且在我的 routing.php 中有下面列出的路由选项(不知道这是否重要)。以为这纯粹是一个 .htaccess 的东西,但是当我想到路由文件时,我想这可能会与重写混淆?

$route['event/jazz/(:any)'] = 'event/view/$1';
$route['(:any)'] = 'pages/view/$1';

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    是的,它会循环,因为源 URI 和目标 URI 都与您的正则表达式模式匹配。

    使用此规则修复它:

    RewriteEngine on
    
    RewriteRule ^event/([^/]+)/?$ /event/jazz/$1 [R=301,L,NC,NE]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* index.php/$0 [PT,L]
    

    【讨论】:

    • 感谢您的回答,但它还没有工作。请参阅我更新的问题。
    • 现在检查更新的代码,你把它倒过来了。使用不同的浏览器进行测试。
    • 现在可以使用了,非常感谢。这个 .htaccess 的东西对我来说还是有点胡言乱语:-)
    • 不客气,很高兴它成功了。请参阅 askapache.com 以获得有关 mod_rewrite 的良好参考
    猜你喜欢
    • 2011-03-08
    • 2013-06-25
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2015-02-21
    • 2011-02-16
    相关资源
    最近更新 更多