gpt4 book ai didi

.htaccess - htaccess 2变量问题

转载 作者:行者123 更新时间:2023-12-04 08:31:11 27 4
gpt4 key购买 nike

之前 我安装了 SSL,一切运行良好!!这是我的根网络服务器 .htaccess 文件中的代码:

Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
它有效,并且完全符合我的要求。所以如果我去例如:
www.andrea.com/account
它访问“www.andrea.com/account.php”。这就是我想要的。
但是,我确实在根目录中有一个名为“产品”的文件夹。该文件夹中还有另一个“.htaccess”文件,我不知道必须更改这两个中的哪一个才能使以下内容正常工作。
当您访问此网址时:
http:____/products/ 查看 /你好再见
我希望它访问“产品”文件夹中的“view.php”,在那个 php 文件中我可以这样做:
$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"]; // This would have "Goodbye"
当我在“产品”文件夹中使用这个 htaccess 时,这很有效:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
上面这段代码的问题是,如果我去:
http:____/products/你好/再见
我希望它访问“产品”文件夹中的“index.php”。但相反,它转到“view.php”!就像上面的 htaccess 代码强制所有人转到 view.php (只有当我在 url 中有“view/____”时才应该这样做。
我希望上面的 url 转到“products”文件夹中的“index.php”,在该文件中我应该能够访问 ID 和 CAT 变量。
关于在我的 .htaccess 文件中更改什么的任何想法?抱歉,我花了 2 个多小时,我的代码底部的一行我都看不懂,但它不起作用:/

最佳答案

 Options +MultiViews

首先,您应该禁用 MultiViews。在 my answer给您的 earlier question ,我对使用 MultiViews 的建议在您的问题的上下文中严格来说是一种“替代”方法。您不能同时使用这两种方法(mod_rewrite 和 MultiViews)来处理无扩展名 URL。而且由于您现在想要做更多的事情并传递参数,MultiViews 只会产生冲突。 (多 View 可能会“获胜”并且不会传递任何参数。)
另外,您是否特别需要额外的 .htaccess /products 中的文件子目录? (可以说)拥有一个 .htaccess 会更容易。文档根目录中的文件。这将避免重复 HTTP 到 HTTPS 的重定向(尽管您实际上没有在子目录 .htaccess 文件中包含 HTTP 到 HTTPS 的重定向?)。
# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

该指令同时匹配 view/Hello/GoodbyeHello/Goodbye ,这解释了为什么所有内容都写入您的 view.php脚本。然而,它实际上也没有按照你说的去做——这令人费解。如果您要求 /products/view/Hello/Goodbye然后它将请求重写为 /products/view.php?id=view&cat=Hello/Goodbye - 这不是本意(除非启用了 MutliViews,在这种情况下根本不会传递任何参数)。
您需要实际检查 views在尝试重写为 views.php 之前在请求的 URL 路径中.如果 views不存在然后重写为 index.php反而。这种“条件分支”可以通过简单地按照“更具体”规则的顺序排列指令来实现。
例如,在您的根目录中 .htaccess文件尝试以下。 (并完全删除 /products/.htaccess 文件。)
# Ensure that MultiViews is disabled
Options -MultiViews

RewriteEngine On

# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat>
RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]

# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L]

# 3. Extensionless URLs for other requests
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
上述 3 条规则的顺序很重要。最具体的规则是第一。包括 L标志以防止进一步(不必要的)处理。
请注意,根据您的原始指令,对于 /products/view/Hello/Goodbye 形式的请求(或 /products/Hello/Goodbye ), Hello/Goodbye部分完全是可选的,自然会导致 idcat正在设置 URL 参数,但为空。
此外,根据您的原始指令, /products/view/Hello/Goodbye/foo/bar/baz 形式的请求将导致 cat URL 参数设置为 Goodbye/foo/bar/baz (任何跟随初始路径段的东西)。
如果您使您的正则表达式更具体并且只匹配您需要匹配的内容,您不一定需要检查请求是否映射到文件或目录(这相对昂贵)。例如,您的正则表达式 /([^/]*)/?(.*)目前几乎匹配任何东西。但是,如果您的 <id><cat>变量只能由小写字母组成(例如),那么这可以避免文件系统检查的需要。
其他注意事项:
  • 您是否需要检查 HTTP 到 HTTPS 重定向中的主机名?您是否托管多个域?否则,检查 HTTP_HOST 的条件服务器变量不是必需的。
  • 关于.htaccess - htaccess 2变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65015896/

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