gpt4 book ai didi

php - 我没有获得所需的 URLRewrite

转载 作者:行者123 更新时间:2023-12-04 15:01:04 26 4
gpt4 key购买 nike

我遇到了一个奇怪的 URL 问题。我正在使用 .htaccessheader(location) 来设置网址。

我认为我正在“重置”底部带有 header (位置)的网址,但它看起来像是我指定的地址附加到当前地址而不是全部替换它。

我的代码是:

$route = ltrim(strtok($_SERVER['REQUEST_URI'], '?'), '/');
if($route == strtolower($route)) {

if($route === 'contact/edit') {
include __DIR__ . '/../myscripts/MainScript.php';
$driver = new MainDriver();
$page = $driver->edit();
}elseif($route === 'contact/add' ) {
include __DIR__ . '/../myscripts/MainScript.php';
$driver = new MainDriver();
$page = $driver->add();
}else {
include __DIR__ . '/../myscripts/MainScript.php';
$driver = new MainDriver();
$page = $driver->home();
}
}else {
http_response_code(301);
header('location: index.php?route=' . strtolower($route));
}

.htaccess 看起来像这样:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L,QSA]
RewriteRule ^/contact/edit(new|existing)$ /index.php?route=/contact/edit$1 [NC,L,QSA]

本地主机打开就好了。但是,如果我尝试去 localhost/contact/editNew,而不是带我去 localhost/contact/editnew 我被带到 localhost/contact/index .php?contact/editnew 和欢迎页面 index.php 已加载!

我认为最后的重写规则是必须修改的内容,但我不确定。这就是为什么我在这里寻求帮助。我根据阅读的 apache.org 上的 mod_rewrite 页面编写了该规则。

如果您需要更多详细信息来了解此问题,请告诉我。

(编辑#2)

我已经将 header 调用编辑为

header('location: ' . strtolower($route);

而且我还是得到了同样的结果,这证实了问题是由我现在正在学习的URLRewrite规则引起的。你们知道如何解决这个问题吗?

最佳答案

您发布的代码存在一些问题...

http_response_code(301);
header('location: index.php?route=' . strtolower($route));

您正在 Location 中传递一个相对 URL header 。 浏览器 将相对于当前 URL 来解决这个问题。如果请求的 URL 是 /contact/editNew那么以上将导致重定向到 /contact/index.php?route=<route> .

您在 Location 中设置的 URL至少应该是根相对的(以斜杠开头),或绝对的(最好)。

这也是一个 301(永久)重定向,因此将由浏览器永久缓存。 (测试 302(临时)重定向以避免潜在的缓存问题。)

您正在重定向到查询字符串 route=<route> ,你也在尝试在你的 RewriteRule 之一中做指令。但是,您的 PHP 脚本仅配置为解析 URL 路径 - 查询字符串从请求中剥离以计算路由:

$route = ltrim(strtok($_SERVER['REQUEST_URI'], '?'), '/');

这会检索查询字符串之前的 URL 部分,并丢弃查询字符串。它还修剪了 /从 URL 路径的开头开始,使其成为相对。所以,如果您稍后使用 header('location: ' . strtolower($route)); - 你会遇到与上述相同的问题。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L,QSA]
RewriteRule ^/contact/edit(new|existing)$ /index.php?route=/contact/edit$1 [NC,L,QSA]

第二条规则似乎没有任何作用?在 RewriteRule 上加上斜杠前缀pattern 重写为 /index.php 后出现无论如何它都不会做任何事情。

但它也不需要做任何事情,至少根据您的 PHP 脚本不需要。您的 PHP 脚本查看请求的 URL 上的 URL 路径。它不会查看重写的 URL 或查询字符串。

次要点,但NCQSA第一个标志 RewriteRule是多余的,正则表达式可以简化为一个点。并且 substitution 字符串上的斜杠前缀不是必需的。例如:

RewriteRule . index.php [L]

如果您只是想将所有 URL 转换为小写,那么您可以在 .htaccess 中执行此操作, 之前您现有的指令:

# Convert URL to lowercase.
RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.*)/"
RewriteRule [A-Z] %1 [R=301,L]

更新:也许您想要将请求的 URL 路径作为查询字符串传递给您的脚本?但是,如前所述,您的 PHP 当前使用的是 URL 路径,而不是查询字符串。

例如,您的 .htaccess会像下面这样:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?route=$1 [QSA,L]

您的 PHP 脚本现在将收到 route作为查询字符串的一部分。您可以使用 $_SERVER['QUERY_STRING'] 检查或 $_GET['route'] PHP 脚本中的 superglobals。或者/并且,您仍然可以检查您当前正在执行的请求的 URL 路径,以提供两种方法来访问您的页面。

注意,通过上面的重写,route URL 参数不会出现在对主页的请求中,因为这是由 DirectoryIndex 处理的(mod_dir).

关于php - 我没有获得所需的 URLRewrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66907994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com