htaccess将错误重定向到子目录


htaccess redirect error to a subdirectory

尝试重定向此始终有效:

RewriteRule ^user/(.*) view_channel.php?user=$1 [nc]

问题是,试图单独重定向下面的语句是有效的,但当与上述语句

RewriteRule ^user/videos/(.*) user_videos.php?user=$1 [nc]

更多关于.htaccess:的详细信息

Options All -Indexes
FileETag MTime Size
Options +FollowSymlinks  -MultiViews
RewriteEngine on
<FilesMatch "'.(db|inc|tmpl|h|ihtml|sql|ini|configuration|config|class|bin|spd|theme|module|cfg|cpl|tmp|log|err|inc.php|class.php)$">
order allow,deny
satisfy all
</FilesMatch>

我做错了什么?

这是因为正则表达式^user/(.*)也匹配类似/user/videos/something的URI。

你的规则是这样的:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^user/videos/([^/]+)/?$ user_videos.php?user=$1 [L,NC,QSA]
RewriteRule ^user/([^/]+)/?$ view_channel.php?user=$1 [L,QSA,NC]

这些规则并非相互不兼容。它们也不是最终的。像这样更改它们:

RewriteRule ^user/([^/]+) view_channel.php?user=$1 [NC,L]
RewriteRule ^user/videos/([^/]+) user_videos.php?user=$1 [NC,L]

[^/]+匹配一个或多个不是/的字符。这确保了第一个规则不能匹配第二个模式,就像它对.*所做的那样,因为它匹配任何字符,当然包括/

第二个RewriteRule语句与已经重写的url匹配。