我的现有网站包含/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]`
答案 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
中有相对路径替换。