【问题标题】:htaccess rewrite causes loop if 404如果 404,htaccess 重写会导致循环
【发布时间】:2012-05-19 16:41:12
【问题描述】:

我知道这里有数百篇关于 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]

【问题讨论】:

  • //? 应该做什么?

标签: .htaccess url-rewriting


【解决方案1】:

您需要在重定向中添加一个条件,即以 .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 页面。

【讨论】:

  • 成功了!十分感谢你的帮助。我还有一件事情正在发生,我希望你能帮忙。当从服务器请求不存在的 PHP 文件时,它不会响应 404 而是“未选择输入文件”消息。我已经读过这个,解决方法似乎是这样的: RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f RewriteRule ^.+\.php$ /404 但我不知道该逻辑应该放在哪里其他条件。
  • 这给了我一个 500 服务器配置错误。很抱歉让我感到痛苦,我希望我能更好地理解这是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多