如何捕获和重定向子目录中未找到的页面

时间:2015-05-27 11:41:40

标签: apache .htaccess redirect

我的现有网站包含/widgets/中的大量网页,新网站也有/widgets/中的网页,其中一些网页与现有网址相对应。但是,该窗口小部件中的许多其他页面不再存在,我只想将它们重定向到/widgets

基本上,我想编写一条规则,捕获未找到的网页,并将其重定向到目标网页(/widgets/),同时允许找到合法网页。

是否可以编写可以执行此操作的规则,还是需要手动重定向它们?

编辑:由于这是使用CMS(工艺),现有规则正在进行中:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]`

2 个答案:

答案 0 :(得分:1)

您可以使用-f

在htaccess中捕获丢失的文件
RewriteEngine On    
RewriteCond %{REQUEST_FILENAME} !-f   // if not a file
RewriteCond %{REQUEST_FILENAME} !-d   // if not a directory
RewriteCond %{REQUEST_URI} /widgets/(.*) // if in directory /widgets
RewriteRule ^.*$ /widgets [L]  // redirect to /widgets

如果要将缺少的页面重定向到小部件子目录之外,可以省略第三行。

答案 1 :(得分:1)

更新:由于这些页面仅存在于CMS本身而不是文件系统上的实际文件,因此CMS也必须管理重定向。 Apache(.htaccess)不知道什么是有效页面或不是有效页面,因此除非您可以确定这些重定向的(文件名)模式,否则您需要在.htaccess中手动指定每个文件/重定向。

由于这是一个外部重定向,因此应该在现有规则之前:

RewriteEngine On
RewriteBase /

# Redirect non-existent files within /widgets/ to /widgets
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^widgets/. /widgets [R=301,L]

# Existing rewrites
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]

请注意,RewriteRule检查/widgets/目录,而不是RewriteCond指令 - 效率较低。

我假设您的原始代码中已经有RewriteBase指令?这是必需的,因为您在RewriteRule中有相对路径替换。