无法使用 .htaccess 重写文件夹



我最近移动了hoster,但在目录中做了一些细微的更改。我将一个文件夹从"listing"重命名为"vendor"。我使用下面的代码来防止404错误。

RewriteEngine On
RewriteRule ^listing/(.*) vendors/$1

这对我不起作用。我该怎么办才能解决这个问题?

旧URL:

http://www.oldsite.com/curacao/listing/chinese-culture-club/

新URL:

http://www.newsite.com/curacao/vendors/chinese-culture-club/

这是完整的.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/[0-9]+..+.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}.txt(?: Comodo DCV)?$
RewriteRule ^index.php$ - [L]
# add a trailing slash to /wp-admin
RewriteCond %{REQUEST_URI} !^/[0-9]+..+.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}.txt(?: Comodo DCV)?$
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/[0-9]+..+.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}.txt(?: Comodo DCV)?$
RewriteRule ^ - [L]
RewriteCond %{REQUEST_URI} !^/[0-9]+..+.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}.txt(?: Comodo DCV)?$
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteCond %{REQUEST_URI} !^/[0-9]+..+.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}.txt(?: Comodo DCV)?$
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*.php)$ $2 [L]
RewriteCond %{REQUEST_URI} !^/[0-9]+..+.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}.txt(?: Comodo DCV)?$
RewriteRule . index.php [L]
RewriteRule ^listing/(.*) vendors/$1
# BEGIN WPSuperCache
# END WPSuperCache
# BEGIN WordPress
# END WordPress
RewriteRule ^listing/(.*) vendors/$1

这似乎比评论中提到的错误更多。首先,您的示例URL更改了主机/域,但这并没有反映在该指令中。或者oldsite.comnewsite.com是否托管在同一个地方(我认为它们是)。此外,您发布的是内部重写,但您可能需要外部重定向才能正确解析404(否则,您最终会得到本质上重复的内容)。

在现有内部重写之前,请在.htaccess文件的顶部尝试以下操作。作为一般规则,外部重定向应始终位于内部重写:之前

RewriteCond %{HTTP_HOST} ^(www.)?oldsite.com [NC]
RewriteRule ^(curacao)/listing/(.*) http://www.newsite.com/$1/vendors/$2 [R=302,L]

您只需要一个RewriteEngine指令,最好在文件的顶部。(它可以在任何地方,但在顶部更合乎逻辑。)

$1是对RewriteRule模式中第一个捕获组的反向引用,在这种情况下只是"curacao",但它避免了重复。2美元是对第二个捕获组的反向引用,就像你以前一样。

R标志指示外部重定向(替换中的绝对URL也可能触发外部重定向,但默认为302)。L(last)确保在该过程中不会再处理mod_rewrite指令

如果这应该是一个永久重定向,那么将302(临时)更改为301(永久)。301被浏览器缓存,因此可能使测试成为问题。

最新更新