Php .htaccess如果存在同名文件名,则重定向文件夹

Php .htaccess如果存在同名文件名,则重定向文件夹,php,apache,.htaccess,mod-rewrite,redirect,Php,Apache,.htaccess,Mod Rewrite,Redirect,某些服务器在与主域相同的文件夹中创建子域文件夹 因此,如果主域的news.php页面同时被重写为/news(只是为了删除php扩展名以进行SEO)和/news文件夹,则用户将被重定向到/news文件夹,而不是news.php文件 我可以将特定文件夹重定向到具有以下内容的文件: RedirectMatch 301 ^/plotki/?$ /plotki.php 但是,如何将它们重定向到与目录相同的文件名,但有一些例外,如/tags、/scripts等,以及主目录中的所有php文件?如果我正确理解

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

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

我可以将特定文件夹重定向到具有以下内容的文件:

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

但是,如何将它们重定向到与目录相同的文件名,但有一些例外,如/tags、/scripts等,以及主目录中的所有php文件?

如果我正确理解了这个问题:当主文件夹中存在一个文件时,您不需要重写。但是,如果文件夹匹配,也不应将其重写为一个文件

假设您希望所有流量都指向“index.php”,但不希望将文件“news.php”(位于主文件夹中)或文件夹“/include/”重定向到index.php

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

RewriteEngine On
重写引擎可根据条件进行工作并进行重写。在您的情况下,在重写之前,可能需要满足多个条件。如果其中一个条件不满足,请不要重写

下一行测试“请求URI”是否包含文本“/include/”。只有在url中不包含该内容时,它才允许您继续下一行并最终重写。您可以像下面的示例一样放置所有异常。请注意,您可以为此使用正则表达式<代码>[NC]
表示“无案例”

将所有异常作为重写条件后,您希望确保如果服务器上存在该文件,则重写规则不适用。这是通过包含“!-f”的行完成的。最后,当请求URL已经是index.php文件时,必须确保不应用重写规则(否则将出现内部以太循环和505错误)。最后一行将所有数据发送到index.php。请注意,我没有向index.php发送任何附加参数。在index.php中,您可以读取$\u SERVER['REQUEST\u URI'],以获取所需的所有数据

您可以使用来测试htaccess条件。脚本将告诉您是否满足条件。请注意,该网站不支持所有变量,如
%{REQUEST\u 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,如果我正确理解了这个问题:当主文件夹中存在文件时,您不需要重写。但是,如果文件夹匹配,也不应将其重写为一个文件

假设您希望所有流量都指向“index.php”,但不希望将文件“news.php”(位于主文件夹中)或文件夹“/include/”重定向到index.php

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

RewriteEngine On
重写引擎可根据条件进行工作并进行重写。在您的情况下,在重写之前,可能需要满足多个条件。如果其中一个条件不满足,请不要重写

下一行测试“请求URI”是否包含文本“/include/”。只有在url中不包含该内容时,它才允许您继续下一行并最终重写。您可以像下面的示例一样放置所有异常。请注意,您可以为此使用正则表达式<代码>[NC]
表示“无案例”

将所有异常作为重写条件后,您希望确保如果服务器上存在该文件,则重写规则不适用。这是通过包含“!-f”的行完成的。最后,当请求URL已经是index.php文件时,必须确保不应用重写规则(否则将出现内部以太循环和505错误)。最后一行将所有数据发送到index.php。请注意,我没有向index.php发送任何附加参数。在index.php中,您可以读取$\u SERVER['REQUEST\u URI'],以获取所需的所有数据

您可以使用来测试htaccess条件。脚本将告诉您是否满足条件。请注意,该网站不支持所有变量,如
%{REQUEST\u 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

,仅供参考,没有任何SEO理由删除文件扩展名。它看起来更好,但排名不会更高。仅供参考,删除文件扩展名没有SEO理由。它看起来更好,但排名不会更高。几乎很好-例外正在工作,但我需要的东西将允许重定向/page到page.php,而不仅仅是index.php,只有在/page文件夹存在的情况下。如果我理解不正确,请纠正我:您只需要url/page/。。。是否被重定向到page.php?所有其他的交通都是这样吗?请参见上面的编辑。@MarekZakrzewski现在是2015年,您正在尝试进行mod_重写,而不是使用路由系统。这就像编写支持IE的JavaScript代码一样6@dave据我所知,2015年mod_重写理论上仍然比routes快。此外,路由至少需要上述mod_重写代码的一部分来捕获一个文件的流量。尽管routes集成在一些框架中,但这并不意味着OP使用一个框架。也就是说,OP仍然是ne