Apache 重写:如何在省略 url 最终斜杠时避免显示 url 参数?

Apache rewrite : how avoid to display url parameter when the url final slash is omitted?

在我的域的 .htacess 中,我必须将子域指向域的第一个 GET 参数。子域代表语言(例如 en.、fr 等...)。 为了达到这个目的,这里重写.htaccess中的代码:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$ [NC]
RewriteRule ^(.*)$ ?lang=%1 [NC,L]

我创建了一个名为 test 的目录。此目录仅包含 index.html 个文件。

因此,当您在浏览器的 url 栏中键入 en.example.com/test/ 时, 重写代码有效。

但是如果你输入 en.example.com/test 而没有最后的斜杠,它会重定向到 en.example.com/test/?lang=en => 这是个问题。

那么你有什么改正的想法吗?

在此先衷心感谢您。

指定 xx.example.com/test/ 时,内部重定向 发生在 xx.example.com/test/?lang=xx。客户端永远不会看到 ?lang=xx.

但是,当指定 xx.example.com/test 时,其中 test 是一个目录, mod_dir 介入并将 URL 重写为 xx.example.com/test/,但在 这样 ?lang=xx 重定向的重写规则变成 public, 让客户将 xx.example.com/test/?lang=xx 视为 URL - 这是不需要的。

为了保持 '?lang=' 重定向在本地(对客户端隐藏) 将其放在 .htaccess 中,在原始重写规则之前:

RewriteCond %{REQUEST_FILENAME}         -d
RewriteRule ^(.+[^/])$                  / [R,L]

条件检查请求的文件名是否为目录, 并且该规则强制客户端重定向 [R],以便请求 xx.example.com/test 的客户端将被重定向到 xx.example.com/test/.

但是关键是 [L],它使这条规则成为最后一条规则,从而阻止了以下规则的执行。如果没有此 L 标志,从 xx.example.com/testxx.example.com/test/?lang=xx 的整个重定向将变为 public.

在客户端被强制重定向到正确的 URL 并终止 / 后,执行内部重定向的重写规则添加 lang GET 参数将正常执行。

这是整个 .htaccess:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME}     -d
RewriteRule ^(.+[^/])$              / [R,L]

RewriteCond %{HTTP_HOST}            ^(.*)\.example\.com$ [NC]
RewriteRule ^(.*)$                  ?lang=%1 [NC,L]

然而,还有另一种方法可以在不使用 Apache 配置和内部重定向的情况下实现这一点,那就是检查 $_SERVER['SERVER_NAME']:

<?php
list( $lang ) = explode('.', $_REQUEST['SERVER_NAME'] );