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/test
到 xx.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'] );
在我的域的 .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/test
到 xx.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'] );