1

我知道这里有数百篇关于 htaccess 的帖子,但我似乎找不到与我的情况相匹配的帖子。

我有两个重写规则发生:

第一个将 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 ...”。我只想获得一个 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]
4

1 回答 1

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 不存在,则应用第二条规则,因为它也不以 a 结尾/,您将被重定向到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 页面。

于 2012-05-19T22:24:15.563 回答