Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何捕获和重定向子目录中未找到的页面_Apache_.htaccess_Redirect - Fatal编程技术网

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

Apache 如何捕获和重定向子目录中未找到的页面,apache,.htaccess,redirect,Apache,.htaccess,Redirect,我有一个现有站点,在/widgets/中有一堆页面,新站点也有/widgets/中的页面,其中一些页面对应于现有的URL。但是,widgets部分中的许多其他页面不再存在,我只想将它们重定向到/widgets 基本上,我想编写一个规则,捕获未找到的页面,并将它们重定向到登录页面(/widgets/),同时允许找到合法页面 是否可以编写这样做的规则,或者我需要手动重定向所有规则 编辑:由于这是使用CMS(工艺),因此存在以下现有规则: RewriteCond %{REQUEST_FILENAME}

我有一个现有站点,在
/widgets/
中有一堆页面,新站点也有
/widgets/
中的页面,其中一些页面对应于现有的URL。但是,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]`

您可以使用-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

如果要将丢失的页面重定向到widgets子目录之外,可以省略第三行。

更新:由于这些页面仅存在于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
指令?这是必需的,因为您的
重写规则中有相对路径替换

,谢谢您的回答。我没有提到编辑我的原始帖子时需要考虑的一些现有规则。如果你将所有内容发送到
index.php
,那么如何找出
不存在的页面
?我假设404完全由CMS处理-以同样的方式处理有效页面(通过在某些数据库或其他数据库中检查
p
的值…?!)这似乎不起作用,因为它仍然在404'ing不存在的页面上:(啊,对不起,应该有一个重定向(
R=301
标志)在
重写规则
上。如果它仍然不起作用,那么它将重定向到什么?它是否重定向?使用301标志,它也将重定向合法请求。这些页面是否仅存在于CMS中?即
/widgets/path/to/valid/file
是否存在于文件系统中,或者仅存在于您的CMS中?如果它仅存在于您的CMS中你的CMS那么我恐怕你也必须在你的CMS中进行重定向,因为Apache/.htaccess不知道该页面是否存在。(我应该在顶部阅读我自己的评论!叹气)一种方法是在您的自定义404中。检查请求路径并相应地重定向-CMS可能会为此提供一个包装器?否则,在PHP中执行此操作相对简单。