如果404,htaccess重写导致循环

时间:2012-05-19 16:41:13

标签: .htaccess url-rewriting

我知道这里有数百篇有关htaccess的帖子,但我似乎无法找到符合我情况的帖子。

我发生了两条重写规则:

第一个将example.com/filename.php转换为example.com/filename/以及example.com/filenameA-filenameB.php转至example.com/filenameA/filenameB /

如果没有,请在请求的URL末尾添加一个尾部斜杠。

一切都很有效......直到您输入错误的网址,例如example.com/foo或example.com/foo/,其中foo.php不存在。我得到“页面没有正确重定向”,地址栏显示“example.com/foo.php.php.php.php.php.php.php.php ...”。我只想获得404,所以我可以重定向到404页面,但我尝试的任何东西似乎都没有用。

感谢您的帮助!

RewriteEngine On 
RewriteBase /

RewriteRule ^(.+)/(.+)//?$ $1-$2.php [NC,L]
RewriteRule ^(.+)//?$ $1.php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://example.com/$1/ [L,R=301]

1 个答案:

答案 0 :(得分:0)

您需要在重定向中添加一个条件,以.php结尾的内容不会被重定向:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ http://example.com/$1/ [L,R=301]

第一次重写后,URI最终为/foo.php,如果foo.php不存在,则应用第二条规则,因为它也不以/结尾,这您被重定向到http://example.com/foo.php/,然后第一组规则将其更改为/foo.php.php,并且它不存在且不会结束斜杠,因此应用第二个规则,将您重定向到{ {3}}等等。


编辑:

  

当从服务器请求不存在的PHP文件时,它不响应404,而是响应“未选择输入文件”消息。

您可以尝试添加此内容:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule \.php$ - [R=404]

这或多或少是您所了解的内容,但规则与以.php结尾的任何内容相匹配,并将您重定向到404页面。