.htaccess 为特定页面提供前缀路径

.htaccess to serve specific pages with prefix path in front of it

我需要提供这些页面:

/类别/*

作为

/shop/category/*

我需要 url 在 /category/ 前面有 /shop 并且它还需要处理类别中的所有嵌套路径结构。

我如何通过首选 .htaccess 执行此操作?

还有一个 /shop/ 页面,我不想被任何 .htaccess 编辑打扰。

所以,我只需要用 url 代替 /shop/category/ 来提供 /category/ 页面,这可以通过 .htaccess 实现吗?

所以我是 .htaccess 重写的初学者,但已经尝试过这个:

RewriteCond %{HTTP_HOST} ^category/$
RewriteRule ^shop/category/(.*)$ category/ [L]

它什么也没做...

也试过这个:

RewriteCond %{HTTP_HOST} ^category/(.*)
RewriteRule ^$ /shop/category/? [R,L]

同样,对任何事情都没有影响。

我正在使用 Wordpress,所以它似乎对我的重写规则有一定的影响力??无论如何,这是我的整个 .htaccess 文件。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

RewriteRule ^shop/category/(.*)$ category/ [R,L]

还在 init wordpress 操作中尝试了以下操作:

add_rewrite_rule('^/shop/category(?:/.*)?', '/category/$matches[1]', 'top');

运气不好。

好的,看来我可能会在这里到达某个地方...

以下 add_rewrite_rule 仅匹配第一个类别,但不匹配子类别:

add_rewrite_rule('shop/category/?([^/]*)', 'index.php?product_category=$matches[1]', 'top');

我使用的自定义分类法是 product_category,而不是 wordpress 默认 category,因为我不希望我的产品类别与 post 类别混合。所以,我现在只需要弄清楚,如何匹配所有路径(包括子类别),例如:

/category/gelest-inc/silanes-silicones/

silanes-silicones 是 gelest-inc 的子项,如何在上面的重写规则中也捕获它?

你的规则说如果 HTTP_HOST 是 catagory/ 那么重写主页(^$ 匹配一个空的 uri 例如 : /)到 /shop/catagory。当您在模式中使用 URI 与 HTTP_HOST header 匹配时,您的 RewriteCond 永远不会满足。

如果你想重定向 /catagory/ 到 /shop/catagory ,你可以使用

RewriteEngine on

RewriteRule ^catagory/([^/]*)/?$ /shop/catagory/ [L,R]

您有 WordPress 规则,规则之后是 "shop" 规则。

当商店 URI 不是真实文件或目录时,对其的请求将由 WordPress 规则处理并重写为 index.php。 Apache 然后用 index.php 进行第二次迭代,但它不符合商店规则并且从不重定向或重写。


要做到这一点,商店规则必须先行

RewriteRule ^shop/category/(.*)$ category/ [R,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

现在这取决于你想要实现什么,从

重定向
RewriteRule ^shop/category/(.*)$ category/ [R,L]

shop/category

RewriteRule ^category/(.*)$ shop/category/ [R,L]

如果我正确理解您的问题,那么 .htaccess 应该可以满足您的要求:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^category(?:/.*)?$ /shop/[=10=] [R=301,NC,NE,L]

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress