【问题标题】:.htaccess redirect a folder if filename existing with the same name如果文件名存在同名,.htaccess 重定向文件夹
【发布时间】:2015-10-13 12:27:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 仅供参考,没有 SEO 理由删除文件扩展名。它看起来更好,但不会排名更高。

标签: php apache .htaccess mod-rewrite redirect


【解决方案1】:

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

假设您希望所有流量到“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

【讨论】:

  • 几乎很好 - 例外情况正常,但我需要一些允许 /page 重定向到 page.php 的东西,而不仅仅是 index.php,前提是 /page 文件夹存在。
  • 如果我理解不正确,请纠正我:您只想将 url /page/... 重定向到 page.php?和所有其他交通一样吗?请参阅上面的编辑。
  • @MarekZakrzewski 现在是 2015 年,您正在尝试进行 mod_rewrites,而不是使用路线系统。这就像编写支持 IE 6 的 JavaScript 代码
  • @dave 据我所知,2015 年 mod_rewrite 理论上仍然比路由快。此外,路由至少需要上述 mod_rewrite 代码的一部分才能将流量捕获到一个文件。即使路由集成在某些框架中,但这并不意味着 OP 完全使用框架。这意味着OP仍然需要使用$_SERVER['REQUEST_URI']的内容自己处理请求,并基本上创建自己的“路由系统”。如果您认为这可能对 OP 有所帮助,请务必提供答案。
  • page.php 只是一个例子——随机页面呢?如果它找到一个现有文件夹 /xxx 它将重定向到 xxx.php。
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 2015-09-23
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多