htaccess - 不需要的重定向到 index.php

Posted

技术标签:

【中文标题】htaccess - 不需要的重定向到 index.php【英文标题】:htaccess - unwanted redirection to index.php 【发布时间】:2022-01-22 16:04:20 【问题描述】:
RewriteEngine ON

# example.com/index.php?c=kb -> example.com/kb
RewriteCond %THE_REQUEST index\.php\?c=([^\s&]+) [NC]
RewriteRule ^ %1? [R=301,L,NE]
RewriteRule ^([^/.]+)/?$ index.php?c=$1 [L,QSA]

以上工作正常,现在我希望在内部将example.com/contact 重写为我尝试过的example.com/contact.php

# contact -> contact.php
RewriteCond %QUERY_STRING ^$
RewriteRule ^contact$ /contact.php? [L]

问题 - 如果我删除第一个代码块(关于 index.php),这会将我重定向到 index.php - 第二部分工作正常 - 没有重定向到 index.php,第二个 @ 似乎有问题987654326@.

【问题讨论】:

"what is the reason" - 您尝试执行这些操作的顺序,也许? @CBroe - 如何重写第二个条件并保持上述顺序? 为什么按这个顺序?这没什么意义。你应该总是从最具体到最不具体。如果你真的想保持这个顺序,你必须在你的第一个块中显式地添加一个异常,让/contact 的请求不变地通过。 【参考方案1】:

使用您显示的示例,请尝试遵循 htaccess 规则文件。请确保在测试您的 URL 之前清除您的浏览器缓存。

RewriteEngine ON
##Rule for contact.php rewrite.
RewriteRule ^(contact)/?$ $1.php [QSA,NC,L]

# example.com/index.php?c=kb -> example.com/kb
RewriteCond %THE_REQUEST \s/index\.php/?\?c=(\S+)\s [NC]
RewriteRule ^ %1? [R=301,L,NE]

##For internal rewrite rules here.
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/?$ index.php?c=$1 [L,QSA]

OR 如果您必须在内部重写 about 到 about.php 或联系到 contact.php,那么您可以使用以下规则。

RewriteEngine ON
##Rule for contact.php rewrite.
RewriteRule ^(contact|about)/?$ $1.php [QSA,NC,L]

# example.com/index.php?c=kb -> example.com/kb
RewriteCond %THE_REQUEST \s/index\.php/?\?c=(\S+)\s [NC]
RewriteRule ^ %1? [R=301,L,NE]

##For internal rewrite rules here.    
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/?$ index.php?c=$1 [L,QSA]

【讨论】:

它的工作原理非常感谢特别是contact|about部分 不错的答案++兄弟

以上是关于htaccess - 不需要的重定向到 index.php的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess Joomla -> Community Builder 中的重定向登录组件

htaccess 301重定向整个网站但有例外

PHP .htaccess重定向

.htaccess 基于 SSL 协议的重定向

wordpress 中 wp-login.php 的重定向和 authuser 的 .htaccess 问题

.htaccess 中的重定向错误 [重复]