我知道这里有数百篇有关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]
答案 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页面。