2012-05-19 70 views
1

我知道这里有数百个关于htaccess的帖子,但我似乎无法找到符合我的情况的帖子。htaccess重写导致循环,如果404

我有两个重写规则发生:

第一回合example.com/filename.php到example.com/filename/以及example.com/filenameA-filenameB.php到example.com/filenameA/filenameB/

第二个在所请求的URL的末尾添加了一个尾部的斜杠(如果没有的话)。

一切都很好,直到你输入一个不正确的URL,例如example.com/foo或example.com/foo/,其中foo.php不存在。我得到“该网页没有正确重定向”,地址栏显示“example.com/foo.php.php.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] 
+0

'//?'应该做什么? – Gerben

回答

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,它不存在也不结束斜线,所以应用第二条规则,将您重定向到http://example.com/foo.php.php/等等,等等


编辑:

当不存在的PHP文件是从服务器请求,它不与404,而是一个“没有输入文件中选择”消息作出响应。

你可以尝试添加此:

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

这或多或少是你读了些什么,但对规则与.php结尾的东西相匹配,并且将您重定向到404页。

+0

这个伎俩!十分感谢你的帮助。 我还有一件事正在发生,我希望你可以帮忙。当从服务器请求不存在的PHP文件时,它不响应404,而是“没有输入文件选择”消息。我已阅读有关此和解决方法似乎是这样的: RewriteCond%{DOCUMENT_ROOT}%{REQUEST_URI}!-f RewriteRule ^。+ \。php $/404 但我无法弄清楚该逻辑应该在哪里去在这些其他条件之中。 –

+0

请参阅编辑回复您的问题 –

+0

这给我一个500服务器配置错误。对不起,想成为一个痛苦,我希望我能更好地理解这是如何工作的。 –