apache htaccess重定向结果不符合预期

ej83mcc0  于 2023-02-19  发布在  Apache
关注(0)|答案(1)|浏览(120)

我希望有人能帮我解决下面的问题。
我有一个多语言站点,其中的语言是example.com/se/post这样的文件夹
我想得到像example.se域分离的语言。到目前为止没有DNS别名和WPML插件的问题。
我遇到的问题是我想将example.com/se/post重定向到example.se/post。我尝试在.HTACCESS文件中使用此规则,但它使用我不需要的/se将URL更改为example.se/se。我不太熟悉.HTACCESS文件中的重写引擎。

<IfModule mod_headers.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?nofairytales\.nl$ [NC]
RewriteCond %{REQUEST_URI} ^/sv(/.*)?$ [NC]
RewriteRule ^(.*)$ http://www.nofairytales.se%{REQUEST_URI} [L,R=301]
</IfModule>
sczxawaw

sczxawaw1#

RewriteCond %{HTTP_HOST} ^(www\.)?nofairytales\.nl$ [NC]
RewriteCond %{REQUEST_URI} ^/sv(/.*)?$ [NC]
RewriteRule ^(.*)$ http://www.example.se%{REQUEST_URI} [L,R=301]

这很接近...您在前面的 condition 中捕获了URL路径(/post部分),但没有在 substitution 字符串中使用它。相反,您使用的是包含完整根相对URL路径的REQUEST_URI
您还在URL路径中匹配了sv,但在TLD中重定向到se。以下操作应能解决此问题(只需进行最小的更改):

RewriteCond %{REQUEST_URI} ^/se(/.*)?$ [NC]
RewriteRule ^(.*)$ http://www.example.se%1 [L,R=301]

其中,%1是对前面 * 条件 *(/post部分)中捕获的子模式的反向引用。
然而,你不需要第二个(甚至第一个)条件,因为它可以在RewriteRule指令中完成。似乎没有必要检查请求的主机名,因为如果语言子目录在URL路径中,那么似乎你应该重定向以删除它。
例如,以下内容应足以重定向单个语言代码:

# Language "se"
RewriteRule ^se(?:/(.*))?$ https://www.example.se/$1 [R=301,L]

包含斜杠分隔符的非捕获组确保目标URL上始终有一个尾部斜杠(在主机名之后)。上面的第一个规则要求用户代理在省略主机名之后的斜杠时“更正”重定向响应(它确实做到了)。
对于多种语言,您可以使用regex * alternate * 修改同一规则。例如:

# All supported languages
RewriteRule ^(se|uk|us|au|id)(?:/(.*))?$ https://www.example.$1/$2 [R=301,L]

假设所有语言代码都使用相同的代码Map到一个TLD。如果不是这样,您可以在规则中实现“Map”(语言代码-〉TLD),或者如果您可以访问服务器配置,则使用RewriteMap。这也可以提供一个“默认”TLD。
您 * 可以 * 更通用,并允许任何两个字符的语言代码在正则表达式中。例如^([a-z]{2})(?:/(.*))?$。并简单地将其传递到TLD。但是,一个未知语言的请求(例如/xx/post)-可能是由于您的站点上的错误导致的-现在将导致格式错误的重定向(因为域名无法解析)或者更糟的是,重定向到等待的竞争对手。除非你对重定向进行分析,否则这可能无法被检测到。因此,对regex/rule进行更严格的限制可能是明智的。

相关问题