除了以文件扩展名结尾的 URL(即 .pdf、.html、...)之外,有没有一种方法可以自动向所有 URL 添加尾部斜线?
Is there a way to automatically add a trailing slash to all URLs except for URLs ending with a file extension (i.e. .pdf, .html, ...)?
这是我的 .htaccess 文件:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mywebsite\.com [NC]
RewriteRule ^(.*)$ https://www.mywebsite.com/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php? [L,QSA]
这是我的 index.php 文件:
<?php
$GLOBALS["DEBUG"] = true;
$GLOBALS["DEBUG_MODE"] = "file";
// $GLOBALS["DEBUG_MODE"] = "stdout";
// $GLOBALS["DEBUG_MODE"] = "global";
$GLOBALS["DEBUG_REGEX"] = "^[^b]";
$GLOBALS["ERROR_LOG"] = true;
// $GLOBALS["DEBUG_SQL"] = true;
// $GLOBALS["PROFILER_SQL"] = true;
// $GLOBALS["DEBUG_CLASS_WALK"] = true;
// $GLOBALS["DEBUG_CLASS_FOUND"] = true;
// $GLOBALS["DEBUG_CLASS_MATCH"] = "c_";
define("DIR_WEBROOT", realpath(dirname(__FILE__)));
include DIR_WEBROOT . "/xfw/app/startup.php";
d();
// pr(db0()->oQueryFetchArray("SELECT * FROM core_contact"));
pr(r::parseUrl());
if ($a = x_Route::path("^/JSON/(JSON|RAW|DIRECT)/([^/]*)/([^/]*)")) {
$class = $a[2];
$method = $a[3];
$a_params = json_decode(trim(file_get_contents("php://input")), true);
// $a_params = array_map('sql_escape_string', $a_params);
try {
$data = [
"message" => "ok",
"data" => call_user_func_array("$class::$method", [$a_params]),
];
} catch (Exception $e) {
$data = [
"message" => "Erreur",
"data" => $e->getMessage() . "\n\n" . getExceptionTraceAsString($e),
];
h("err");
pr(getExceptionTraceAsString($e));
h("$class::$method");
pr($a_params);
}
if ($a[1] == "JSON") {
echo json_encode($data);
} elseif ($a[1] == "DIRECT") {
echo json_encode($data["data"]);
} else {
echo $data;
}
exit;
}
if ($a = r::path("^/$")) {
header("Location: /fr/ ");
exit;
}
if (!r::path("/$")) {
header("Location: ".ROUTE_PATH."/");
exit;
}
if ($a = r::path("^/fr/$")) {
echo View::renderTemplatePublic("public/fr/home.html");
exit;
}
if ($a = r::path("^/fr/contact/$")) {
echo View::renderTemplatePublic("public/fr/contact.html", [
"message" => c_Page::message()
]);
exit;
}
if ($a = r::path("^/fr/(.*)/")) {
echo View::renderTemplatePublic("public/fr/$a[1].html");
exit;
}
我想要一个规则,它会在所有 URL 中添加一个尾部斜杠,但扩展名为(.pdf、.html、...)的 URL 除外。任何人都可以帮助我实现这一目标,以便当我有一个像 mywebsite.com/example.pdf 这样的 URL 时,它不会将我重定向到 mywebsite.com/example.pdf/ 并在末尾添加斜线?
看起来像
if (!r::path("/$")) {
header("Location: ".ROUTE_PATH."/");
exit;
}
是这里需要修改的部分。这似乎是在使用正则表达式; /$
只检查值是否以斜杠结尾,并且条件是否定,如果没有则重定向。
与其试图想出一个更复杂的正则表达式,我可能会在这里使用 pathinfo
。尝试将该部分替换为
if (!r::path("/$") && pathinfo(ROUTE_PATH, PATHINFO_EXTENSION) === '') {
header("Location: ".ROUTE_PATH."/");
exit;
}
PATHINFO_EXTENSION
标志仅使 pathinfo
return 成为扩展名,如果路径实际上没有任何扩展名,它将只是 return 一个空字符串。
这是我的 .htaccess 文件:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mywebsite\.com [NC]
RewriteRule ^(.*)$ https://www.mywebsite.com/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php? [L,QSA]
这是我的 index.php 文件:
<?php
$GLOBALS["DEBUG"] = true;
$GLOBALS["DEBUG_MODE"] = "file";
// $GLOBALS["DEBUG_MODE"] = "stdout";
// $GLOBALS["DEBUG_MODE"] = "global";
$GLOBALS["DEBUG_REGEX"] = "^[^b]";
$GLOBALS["ERROR_LOG"] = true;
// $GLOBALS["DEBUG_SQL"] = true;
// $GLOBALS["PROFILER_SQL"] = true;
// $GLOBALS["DEBUG_CLASS_WALK"] = true;
// $GLOBALS["DEBUG_CLASS_FOUND"] = true;
// $GLOBALS["DEBUG_CLASS_MATCH"] = "c_";
define("DIR_WEBROOT", realpath(dirname(__FILE__)));
include DIR_WEBROOT . "/xfw/app/startup.php";
d();
// pr(db0()->oQueryFetchArray("SELECT * FROM core_contact"));
pr(r::parseUrl());
if ($a = x_Route::path("^/JSON/(JSON|RAW|DIRECT)/([^/]*)/([^/]*)")) {
$class = $a[2];
$method = $a[3];
$a_params = json_decode(trim(file_get_contents("php://input")), true);
// $a_params = array_map('sql_escape_string', $a_params);
try {
$data = [
"message" => "ok",
"data" => call_user_func_array("$class::$method", [$a_params]),
];
} catch (Exception $e) {
$data = [
"message" => "Erreur",
"data" => $e->getMessage() . "\n\n" . getExceptionTraceAsString($e),
];
h("err");
pr(getExceptionTraceAsString($e));
h("$class::$method");
pr($a_params);
}
if ($a[1] == "JSON") {
echo json_encode($data);
} elseif ($a[1] == "DIRECT") {
echo json_encode($data["data"]);
} else {
echo $data;
}
exit;
}
if ($a = r::path("^/$")) {
header("Location: /fr/ ");
exit;
}
if (!r::path("/$")) {
header("Location: ".ROUTE_PATH."/");
exit;
}
if ($a = r::path("^/fr/$")) {
echo View::renderTemplatePublic("public/fr/home.html");
exit;
}
if ($a = r::path("^/fr/contact/$")) {
echo View::renderTemplatePublic("public/fr/contact.html", [
"message" => c_Page::message()
]);
exit;
}
if ($a = r::path("^/fr/(.*)/")) {
echo View::renderTemplatePublic("public/fr/$a[1].html");
exit;
}
我想要一个规则,它会在所有 URL 中添加一个尾部斜杠,但扩展名为(.pdf、.html、...)的 URL 除外。任何人都可以帮助我实现这一目标,以便当我有一个像 mywebsite.com/example.pdf 这样的 URL 时,它不会将我重定向到 mywebsite.com/example.pdf/ 并在末尾添加斜线?
看起来像
if (!r::path("/$")) {
header("Location: ".ROUTE_PATH."/");
exit;
}
是这里需要修改的部分。这似乎是在使用正则表达式; /$
只检查值是否以斜杠结尾,并且条件是否定,如果没有则重定向。
与其试图想出一个更复杂的正则表达式,我可能会在这里使用 pathinfo
。尝试将该部分替换为
if (!r::path("/$") && pathinfo(ROUTE_PATH, PATHINFO_EXTENSION) === '') {
header("Location: ".ROUTE_PATH."/");
exit;
}
PATHINFO_EXTENSION
标志仅使 pathinfo
return 成为扩展名,如果路径实际上没有任何扩展名,它将只是 return 一个空字符串。