首页 > 解决方案 > 如何使用 htaccess 删除部分 url

问题描述

我已经查看了一些关于堆栈溢出的类似问题,但我尝试过的似乎不起作用。

'quotes' 是一个包含 wordpress 安装的子文件夹。因此,主根目录中有一个 wordpress 站点,“quotes”子文件夹中也有一个 wordpress 安装。

我有一条类似的路径

https://example.com/quotes/uk/travel-packages
https://example.com/quotes/us/travel-packages

但我不希望“引号”出现在网址中,它应该只是

https://example.com/uk/travel-packages

我目前有这个

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

    
RewriteRule ^quotes/(.*)$ /$1 [L,NC,R]

RewriteRule ^uk/(.*) /quotes/$1 [L]
RewriteRule ^us/(.*) /quotes/$1 [L]

</IfModule>

编辑:我在我的本地主机上尝试这个,因此重写基础是 /example/ 所以我现在理解那里的混乱。

这是根目录和根目录中的引号子文件夹的实时服务器 .htaccess 文件。

根:

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<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

报价子目录

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

# END WordPress

标签: .htaccessmod-rewriteurl-rewriting

解决方案


如果/quotes是包含 WordPress 安装的子目录,并且您已经/quotes从 WordPress 本身的 URL 中删除,那么您需要配置两个.htaccess文件:

  1. /quotes文档根目录中的一个,它在内部(无条件地)重写所有对子目录的请求。

  2. 子目录中的另一个.htaccess文件/quotes将请求路由到 WordPress - 包含“标准”WordPress 前端控制器。

在(根)/.htaccess文件中:

RewriteEngine On

# Internally rewrite all requests to WordPress subdirectory
RewriteRule ^ quotes%{REQUEST_URI} [L]

/quotes/.htaccess文件中:

RewriteEngine On

# OPTIONAL...
# Redirect any direct requests for "/quotes/<anything>" back to root
# NB: WP itself *must* already be correctly configured to omit "/quotes" from the URL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=301,L]

# WordPress front-controller
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

检查REDIRECT_STATUS环境变量是为了确保只有直接请求被重定向,而不是由 WP 前端控制器重写请求 - 否则会导致重定向循环。


或者,您在文档根目录中只有一个.htaccess文件(并删除- WordPress - 子目录中的.htaccess文件)。/quotes例如:

RewriteEngine On

RewriteBase /quotes

# OPTIONAL...
# Redirect any direct requests for "/quotes/<anything>" back to root
# NB: WP itself *must* already be correctly configured to omit "/quotes" from the URL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^quotes/(.*) /$1 [R=301,L]

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

从您的问题更新看来,您在文档根目录中还安装了第二个 WordPress。不可能有两个单独的 WordPress 安装并使它们在文档根目录中显示为单个 WP 站点(即,不将子目录指定为 URL 的一部分),除非两个站点之间的 URL 结构存在一些明显的差异。否则,您不知道应该将哪些 URL 路由到子目录中的 WP 安装,以及哪些 URL 应该路由到文档根目录中的站点。

将来任何带有/us/uk任何国家/地区扩展名的都应该转到,/quotes否则它应该转到路由或从根站点调用的任何页面,例如,https://example.com/contant-us应该转到根联系我们页面。

是的,这是可能的。对于“任何”国家/地区扩展,我假设为 2 个小写字母 az 的字符串。尽管这确实意味着文档根目录中的 WP 站点不能有任何以 2 个字母路径段开头的 URL。

通常,您会修改现有指令(如上)。但是,由于这是 WordPress,因此# BEGIN WordPress不应修改代码块中的指令(除非您阻止 WP 对其进行修改)。相反,我们将在 WP 前端控制器之前添加一些指令。

在(根)/.htaccess文件中:

# Rewrite any URLs that contain a language code prefix to the subdirectory
RewriteRule ^[a-z]{2}/ quotes%{REQUEST_URI} [L]

# BEGIN WordPress
# : (Remainder of existing .htaccess file goes here)

/quotes/.htaccess文件中:

# OPTIONAL...
# Redirect any direct requests for "/quotes/<anything>" back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=301,L]

# BEGIN WordPress
# : (Remainder of existing .htaccess file goes here)

这假设您将直接访问静态资源。例如。使用/quotes该站点中包含的资源的子目录,因此/quotes子目录不会完全隐藏。


请参阅这个问题的第二部分的回答,关于缺少静态资源(图像、CSS 和 JS)的子目录中的第二个 WordPress 安装,这可能是由于实现上述重写/重定向而导致的。


推荐阅读