如果我正确理解问题:当主文件夹中存在文件时,您不希望重写。但是,如果一个文件夹匹配,它也不应该重写为一个文件。
假设您希望所有流量到“index.php”,但不希望文件“news.php”(位于主文件夹中)或文件夹“/include/”重定向到 index.php
最简单的方法是使用重写规则。为此,您首先需要打开.htaccess 文件中的rewriteEngine。
RewriteEngine On
rewriteEngine 使用条件和重写。在您的情况下,在重写之前可能需要满足多个条件。如果其中一个条件不满足,请不要重写。
以下行测试“请求 URI”是否包含文本“/include/”。只有当它不包含在 url 中时,它才会让你继续下一行并最终重写。您可以像下面的示例一样放置所有异常。请注意,您可以为此使用正则表达式! [NC] 表示“无案例”more info
RewriteCond %{REQUEST_URI} !/include/ [NC]
RewriteCond %{REQUEST_URI} !(/include/|/folder 2/|/folder[0-9]{2}) [NC]
将所有例外作为重写条件后,您要确保如果文件存在于服务器上,则重写规则不适用。这是通过包含“!-f”的行完成的。最后,您必须确保当请求 URL 已经是 index.php 文件时不应用重写规则(否则您将获得内部的以太循环和 505 错误)。最后一行将所有数据发送到 index.php。 请注意,我没有向 index.php 发送任何其他参数。在 index.php 中你可以读取 $_SERVER['REQUEST_URI'] 来获取你需要的所有数据!
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !index.php [NC]
RewriteRule ^(.*)$ /index.php [L]
您可以使用http://htaccess.madewithlove.be/ 来测试您的 htaccess 条件。该脚本将判断是否满足条件。 请注意,该网站并不支持所有变量,例如%{REQUEST_FILENAME}
==编辑==
如果您只想将流量重定向到 /page/... 到 page.php,但保留所有其他流量,您可以再设置一个条件。
RewriteCond %{REQUEST_URI} !/include/ [NC]
RewriteCond %{REQUEST_URI} ^/page/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !page.php [NC]
RewriteRule ^(.*)$ /page.php [L]
^/page/ 表示:^ 表示字符串的开头,因此,请求 URI 必须以/page/ 开头才能匹配条件。如果这样做,它将继续并将该 url 重写为 page.php