.htaccess重定向文件夹,如果文件名存在相同的名称


.htaccess redirect a folder if filename existing with the same name

有些服务器在与主域相同的文件夹中创建子域文件夹。

因此,如果主域的news.php页面被重写为/news(只是为了删除SEO扩展名)和/news文件夹同时存在,则用户将被重定向到/news文件夹而不是news.php文件。

我可以重定向特定文件夹到一个文件:

RedirectMatch 301 ^/plotki/?$ /plotki.php

但如何重定向到相同的文件名作为目录与一些例外,如/tags,/scripts等和所有PHP文件在主目录?

如果我正确理解了这个问题:当一个文件存在于主文件夹中时,您不希望重写。但是,如果一个文件夹是匹配的,它也不应该重写为一个文件。

让我们假设你希望所有的流量到"index.php",但不希望文件"news.php"(它在主文件夹中)和文件夹"/include/"被重定向到index.php

最简单的方法是使用重写规则。为此,您首先需要打开.htaccess文件中的rewriteEngine

RewriteEngine On
rewriteEngine处理条件和重写。在您的情况下,在重写之前可能需要满足多个条件。如果其中一个条件不满足,则不重写。

下面一行测试"请求URI"是否包含文本"/include/"。只有当它不包含在url中,它才会让你继续下一行并最终重写。您可以像下面的示例那样放置所有异常。请注意,您可以使用正则表达式![NC]表示"No-case"更多信息

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