.htaccess - 如何使用 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
解决方案
如果/quotes
是包含 WordPress 安装的子目录,并且您已经/quotes
从 WordPress 本身的 URL 中删除,那么您需要配置两个.htaccess
文件:
/quotes
文档根目录中的一个,它在内部(无条件地)重写所有对子目录的请求。子目录中的另一个
.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 安装,这可能是由于实现上述重写/重定向而导致的。
推荐阅读
- c# - 如何使用 MVVM 将 UserControl 参数传递给 ViewModel
- r - 在 reactive() 下使用多个 RenderUI
- jquery - 如何将字段添加到默认的 KendoGrid 弹出菜单?
- rabbitmq - RabbitMQ - 应用程序未在 Windows 10 Home 中启动
- python - 如何使用 matplotlib 使用 groubby 绘制数据
- python - How can I solve variables in pandas dataframe?
- c# - 是否可以解析运行时派生类 T 值的“ObjectResult”基础的“StatusCode”?
- javascript - How to render local PDF file with PDF.js library?
- azure - 在 Azure Functions 应用中存储 Azure ConnectionString 的位置
- javascript - 如果对象具有特定值,则使用 Mongo 脚本更新对象