我最近在我的.htaccess
文件中添加了一小段代码:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]
好吧,我想我明白这里发生了什么。如果找不到文档,删除PHP文件扩展名的这一小段代码会导致循环。这个循环导致500服务器错误而不是(正确的)404.不幸的是我对这些重写实际上做了什么很少了解,所以我不知道如何重写它只是在文档存在时才触发这个重定向。 / p>
我已经做了一些阅读,我不确定Apache认为什么是“常规”文件。我的意思是它有效,但为什么第一行不是-f
而不是!-f
? -u
是实现这一目标的唯一方法吗?
答案 0 :(得分:20)
您应该测试新路径是否指向现有文件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]
否则您将获得无限递归(错误500)。
答案 1 :(得分:2)
正如您所建议的那样,这些规则的目的是允许某人在不包含PHP扩展名的情况下请求页面。因此,如果您在 example.com 上有一个名为 about.php 的文件,那么有人可以使用 http://example.com/about 中的网址为了访问它。
但是,如果有人直接请求 http://example.com/about.php ,则您不希望将其重写为 http://example.com/about.php.php 。同样,您不希望重写对图像,CSS样式表等的请求。这是2 RewriteConds的用武之地,它们的条件是只有当请求与实际存在于文件(!-f
)或目录(!-d
)不匹配时才会进行重写。站点。
要回答为什么你得到500,这可能是因为Apache中的权限被配置为不允许在htaccess文件中重写规则或其他几个原因之一。检查error_log的结尾以查看其中是否有任何消息。
答案 2 :(得分:0)
首先,这里有一些参考可以更好地理解mod_rewrite模块:
你看到的问题是它正在检查这两个条件,默认为[AND],当你只想检查一个时,试试这个:
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]