简单的.htaccess重定向会导致无限循环

时间:2018-10-27 18:20:18

标签: apache .htaccess redirect url-redirection http-redirect

有人可以帮助我吗?我正在使用此简单语句将根index.htm重定向到根目录/

Redirect 301 /index.htm /

但这会导致无限循环。它重定向到我的根目录,因此可以完成工作。但是现在不可能将请求发送到根目录而又不会收到错误通知您有关无限重定向的信息。我的问题:为什么?以及如何避免这种情况?

€dit:现在我有了:

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [NC,QSA,L]

RewriteRule ^((.*)/)?index.[(php)(htm)(html)] $1
[R=301,L]

如果我注释掉其中一个规则,则另一个规则运行良好。但是,同时拥有这两个规则将导致在每种情况下都重写为根。请帮忙!

€it 2:

我想要的是使用单个index.php文件处理所有传入请求,并由于内容重复而将每个index.php,index.htm和index.html重定向到其目录。该怎么做?

€it 3:

现在,一切都像个魅力!

RewriteEngine On

RewriteBase /

#Redirects http://host.tld/gamedev to http://gamedev.host.tld/
Redirect 301 /gamedev/ http://gamedev.host.tld/

#Redirects every request to a subdirectory's index file to the subdirectory because of duplicated content
RedirectMatch ^/(.*)/index.(php|html?)$ http://gamedev.host.tld/$1

#Remove index file from a root folder request
RewriteCond %{THE_REQUEST} \s/index\.(php|html?)
RewriteRule ^index\.(php|html?)$ / [R=302,L]

#Handling all incoming requests with index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

非常感谢 达斯·月亮

2 个答案:

答案 0 :(得分:2)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [NC,QSA,L]

RewriteRule ^((.*)/)?index.[(php)(htm)(html)] $1
[R=301,L]
     

...同时拥有这两个规则会导致在每种情况下都重写为根。

由于第一个规则将请求重写为index.php之后,重写过程重新开始,第二个规则随后从URL中剥离了一切

您的第二条规则不正确。它与您认为匹配的内容不匹配,并且不必要地与任何URL路径匹配。您说这只需要匹配根目录中的索引文档。

[(php)(htm)(html)]-大概是要匹配这些文件扩展名中的任何一个,但是它匹配单个字符:pht,{{1 }}或m。要匹配lphphtm,您需要使用替代。例如:html(php|htm|html)。 ((php|html?)使?在第二种模式中是可选的。)

这些指令的顺序也错误。外部重定向应该在您的前控制器之前

@Benjamin的答案几乎在按钮上,除了 condition (永远不会匹配),而且该条件必须放在l文件的顶部。

请尝试以下操作:

.htaccess

重写时不需要RewriteEngine On RewriteBase / # Remove /index.php from URL RewriteCond %{THE_REQUEST} \s/index\.php RewriteRule ^index\.php$ / [R=302,L] # Front controller RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . index.php [L] QSA标志。

在第一种情况下检查NC的原因是为了防止重定向循环(在某些情况下)。 THE_REQUEST包含初始请求中的THE_REQUEST标头,并且在重写URL后不会更改。

使用Host(临时)重定向进行测试,仅当确定可以正常运行时,才将其更改为302(永久)。 301会被浏览器硬缓存,因此会使测试产生问题。与往常一样,在测试之前,您必须确保清除浏览器缓存。

答案 1 :(得分:1)

我认为您无法通过“简单重定向”来实现此目的。之所以会导致无限循环,是因为在访问根目录/index.htm时,您的apache试图传递文件/的内容,因为它是目录索引列表的一部分。现在您的重定向生效了(因为您<虚拟>虚拟访问页面/index.htm),并且该过程从头开始。

要解决您的问题,您应该使用重写规则而不是重定向。重写规则仅影响所请求的URL,并且不会以无限循环结尾。以下规则适用于您的情况:

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/index\.htm
RewriteRule ^index.htm$ / [R=301,L]