我想将example.com/chapter-foo.php重定向到example.com/chapter.php

时间:2017-07-12 10:51:27

标签: regex .htaccess

我的网站上有一些类似的网页:

  • example.com/dogs-foo1.php
  • example.com/dogs-foo2.php
  • example.com/dogs-foo3.php

然后

  • example.com/cats-foo1.php
  • example.com/cats-foo2.php
  • example.com/cats-foo3.php

现在我用标签菜单简化了网站,我只有

  • example.com/dogs.php
  • example.com/cats.php

现在我想要尝试去的人:example.com/cats-foo1.php 被重定向到:example.com/cats.php 而不是获得404 无论如何,也许有htaccess?

1 个答案:

答案 0 :(得分:1)

这可能就是你要找的东西:

RewriteEngine on 
RewriteRule ^/?cats-.+.php$ /cats.php [R=301]

为此,您需要将重写模块启用到http服务器。您应该将它放在http服务器主机配置中。如果您决定使用动态配置文件(.htaccess),则需要首先启用它们的解释(请参阅官方文档中的AllowOverride指令)。

我建议更进一步,使用模式https://example.com/cats中的网址,这样就没有标准的.php。您需要一些额外的内部重写规则:

RewriteEngine on 
# external redirect from /cats-foo.php to /cats
RewriteRule ^/?cats-.+\.php$ /cats [R=301]
RewriteRule ^/?cats\.php$ /cats [R=301]
# internal rewrite 
RewriteRule ^/?cat$ /cats.php [END]

这也可以概括为:

RewriteEngine on 
# external redirect from /cats-foo.php to /cats
RewriteRule ^/?(\w+])-.+.php$ /$1 [R=301]
# internal rewrite 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(\w+])$ /$1.php [END]

如果您遇到具有该规则的http状态500,则可能会运行非常旧版本的apache http服务器。您将在http服务器错误日志文件中找到抱怨END标志的条目。在这种情况下,将其替换为L标志,然后重试。

您可能需要调整这些行,我们不知道您的具体情况。但是上面的内容应该让您开始并阅读您使用的工具的文档,您可以从这里开始:http://httpd.apache.org/docs/current/mod/mod_rewrite.html

一般提示:您应该始终更喜欢将此类规则放在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess样式文件)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。