.htaccess htaccess -不在当前上下文中[/],忽略

lmvvr0a8  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(150)

更新
我找到了this post,它解释了RewriteRule可以在.htaccess中使用,但需要修改。
这是可行的,但它需要是RewriteEngine On下的第二个规则

RewriteRule ^/?find-a-home/new-homes/greenbooth/?(.*)$ https://demo.com/new-homes [L]

这适用于以下URL

/find-a-home/new-homes/greenbooth/property-type/bower

但是,如何修改它以处理带有查询字符串的URL呢?

/find-a-home/new-homes/greenbooth-village/property-types?property_beds=&property_type_price=60000

我制定了htaccess规则

RewriteRule ^/?find-a-home/new-homes/greenbooth/?(.*)$ https://demo.com/new-homes [R=301,L]

我在这里测试过了https://htaccess.madewithlove.com?share=ebd5828d-9535-4ae9-b74a-1b70a19535a2
wwwhtaccess.madewithlove.com验证器说它工作。
但是,当我将demo.com更新为我的实际url并将其放在我的服务器上时,它不起作用?
我检查了服务器日志,发现此错误

2022-06-14 10:27:37.449888 [INFO] [515989] [T0] [HTAccess] [/home/wwwsite/public_html/.htaccess:7] Redirect URL [^/find-a-home/new-homes/greenbooth/(.*)] does not fall inside current context [/], ignore.

does not fall inside current context是什么意思?是否有方法更新RewriteRule,使其符合当前上下文?
我试图用一个规则来捕获多个页面。我有一堆这样的页面

https://demo.com/find-a-home/new-homes/greenbooth/property-types/gilson
https://demo.com/find-a-home/new-homes/greenbooth/property-types/holtham
https://demo.com/find-a-home/new-homes/greenbooth/property-types/howarth

我想捕获任何包含find-a-home/new-homes/greenbooth的URL并重定向到https://demo.com/new-homes
据我所知,Redirect 301不接受regex表达式--这就是为什么我使用RewriteRule。
有人能帮忙吗?
.htaccess文件。其余的规则起作用。

# Perch Runway
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/perch 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /perch/core/runway/start.php [L] 

# doesn't work, doesn't error?
RewriteRule ^/?find-a-home/new-homes/greenbooth/?(.*)$ https://demo.com/new-homes [R=301,L]

Redirect 301 /index.htm /
Redirect 301 /portfolio.htm /find-a-home/new-homes
Redirect 301 /buyers.htm /
Redirect 301 /land.htm /
qqrboqgw

qqrboqgw1#

RewriteCond %{REQUEST_URI} !^/perch 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /perch/core/runway/start.php [L] 

# doesn't work, doesn't error?
RewriteRule ^/?find-a-home/new-homes/greenbooth/?(.*)$ https://demo.com/new-homes [R=301,L]

这两个规则的顺序是错误的。对/find-a-home/new-homes/greenbooth/<anything>的请求(我假设它没有Map到物理文件)首先被重写为/perch/core/runway/start.php。因此,第二个规则从不匹配,也不做任何事情。
通常,外部重定向需要在内部重写之前进行。
这两个规则也可以通过几种方式简化。在 substitution 字符串中不使用反向引用,因此不需要捕获子模式(即(.*))。检查URL是否以perch开头的 condition 应该移到RewriteRulepattern 中(不需要额外的 condition)。
例如:

# Redirects
RewriteRule ^find-a-home/new-homes/greenbooth https://example.com/new-homes [R=301,L]

# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !perch /perch/core/runway/start.php [L]

正则表达式^find-a-home/new-homes/greenbooth匹配所有以该字符串 * 开头 * 的URL(.htaccess中没有斜杠前缀)。
您应该先测试302(暂时)重新导向,以避免潜在的快取问题。

But how would I modify it to handle URLs with query strings?

/find-a-home/new-homes/greenbooth-village/property-types?property_beds=&property_type_price=60000

这取决于你的意思。上面的规则已经“处理带有查询字符串的URL”,因为它们将被重定向。上面的规则将重定向指定的URL。但是,查询字符串在重定向过程中默认被保留。如果你想从重定向响应中删除查询字符串,那么在重定向中包括QSD(放弃查询字符串)标志。
例如:

RewriteRule ^find-a-home/new-homes/greenbooth https://example.com/new-homes [QSD,R=301,L]

相关问题