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



我有一个网站,里面有一些这样的页面:

  • 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吗?

这可能是您要查找的:

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

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


但是,我建议更进一步,沿着模式https://example.com/cats使用URL,这样就没有尾随.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样式文件(。这些文件是出了名的容易出错,难以调试,而且它们确实会降低服务器的速度。它们仅作为最后选项提供,用于您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商(,或者如果您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦(。

最新更新