如果发生404错误,则仅针对特定模式重写规则

时间:2013-07-31 13:24:45

标签: php apache .htaccess mod-rewrite http-status-code-404

我正在尝试更新我的.htaccess文件,目标是将所有响应“找不到404文件”的页面 - 错误重写到另一个网址。

实施例: 我有这三个链接:

404 :domain.com/category1/123-article-name.html

正常工作:domain.com/static-page/10-ways-to-destroy-your-webpage.html

未触及:domain.com/simple-website.html

在这种情况下,应将第一个链接重定向到 domain.com/lost/123-article-name.html , 第二个已经完成了。第三个链接永远不会受到我的规则的影响。

希望你们能帮助我。对我来说,这真的很难解决! 谢谢!

修改

RewriteRule ^(.*)/([0-9]+)-(.+).html$ lost/$2-$3.html [L]

这是我到目前为止所做的,但这条规则有点“愚蠢”,因为它不会测试所请求页面是否存在。

1 个答案:

答案 0 :(得分:0)

您的规则和CMS的规则是互斥的。

第41行(你的规则)只有在文件存在时才会执行,因为如果文件不存在(第38行和第39行的rewriteConds),服务器会尝试返回index.php?page=path_name,这将产生404错误。

如果您知道缺少的类别/目录的名称,则按照第10行到第35行,然后您可以将规则应用于包含它们的网址。

RewriteRule ^(Ausbildung|Ausland|Berufswelt)/(?=.+-)(.+).html$ lost/$2.html

原始答案

您可以通过添加重写条件来测试文件或目录是否存在

RewriteCond %{REQUEST_FILENAME} !-f # True if the request isn't a file
RewriteCond %{REQUEST_FILENAME} !-d # True if the request isn't a directory
RewriteRule ^.*/([0-9]+)-(.+).html$ lost/$2-$3.html [L] 
#not I removed the first capture group because it is unnecessary.

旁注:在您的示例中,因为+在正则表达式中是贪婪的,所以捕获的域为domain.com/category1/123-article-name.html

  • 123-制品
  • 名称

哪个有效,但可能会人为地限制你。您可以更改规则以包含前瞻性:

RewriteRule ^.*/(?=.+-)(.+).html$ lost/$1.html

(?=.+-)告诉正则表达式引擎为任意数量的字符创建匹配项,如果找到至少一个-

你应该查看这个htaccess test,它真棒!