由于 htaccess 文件而禁止传递变量

Posted

技术标签:

【中文标题】由于 htaccess 文件而禁止传递变量【英文标题】:Pass variable forbidden because of htaccess file 【发布时间】:2012-05-31 15:24:52 【问题描述】:

这是我的第二个帖子,因为我也找不到解决方案,所以我期待您的帮助。我公司的网站是由一名离职员工创建的。他使用 htaccess 文件来交换网站中的所有链接。现在,当我想通过地址栏将变量从一页传递到第二页时,由于htaccess的影响,第二页无法获取变量。当我对 htaccess 文件的经验很少时,任何人都可以帮助我找到修改 htaccess 的解决方案。这是htacess文件。

RewriteEngine On
Options All -Indexes
DirectoryIndex index.php
RewriteRule ^index\.html$ index.php
RewriteRule ^B2C/(.*)/(.*)/(.*).html$ index.php?lang=$1&p=$2&id=$3
RewriteRule ^B2C/(.*)/(.*).html$ index.php?lang=$1&p=$2
RewriteRule ^B2C/(.*)/$ index.php?lang=$1
RewriteRule ^postoffice.html$ more/PO.php
RewriteRule ^hospital-clinic.html$ more/HO.php
ErrorDocument 401 /errors/401.html
ErrorDocument 403 /errors/403.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html

这是我在标签中的代码,它想在页面“1”中传递变量 $main_po_num

echo "<td><a href='B2C/$lang/Contact_detail.html?abc=$main_po_num'>$main_po_num</a></td>";

这是我在“2”页中转储的代码,它返回 NULL(意味着无法获取 pass 变量)

var_dump ($_GET["abc"]);

连地址栏都可以显示变量

.64.4:1234/B2C/vi/Customer_Contact?abc=S110023845.html

那么我怎样才能修改 htacess 然后我可以通过并获取 2 页之间的变量。谢谢

【问题讨论】:

【参考方案1】:
RewriteRule ^B2C/(.*)/$ index.php?lang=$1 [QSA]

[QSA] 标志将查询字符串(在您的情况下为 abc)附加到此规则。目前,您的规则会忽略传递的查询字符串并仅使用 lang 等变量。要将此应用于您的所有规则,每条规则的末尾都需要此标志。

来自mod_rewrite documentation:

修改查询字符串

默认情况下,查询字符串原封不动地传递。你可以, 但是,在包含查询的替换字符串中创建 URL 字符串部分。只需在替换字符串中使用问号 表示应将以下文本重新注入 请求参数。当你想删除一个现有的查询字符串时,结束 仅带问号的替换字符串。 新旧结合 查询字符串,使用 [QSA] 标志。

【讨论】:

【参考方案2】:

在所有重写规则的末尾添加[qsa]。

这将添加 get 变量。

【讨论】:

感谢您的快速回复。您的意思是在 Rewriterule 的底部写 ---a [qsa]--- 或仅 ---[qsa]--- 或 ---rewriterules a [qsa]---。 见埃文穆拉夫斯基的回答。在车里写字有点难。【参考方案3】:

我有一段时间没有使用 htaccess,所以这只是一个相当有根据的猜测,但您可以尝试一下。

这一行:

RewriteRule ^B2C/(.*)/(.*).html$ index.php?lang=$1&p=$2

正在研究您的示例:

<a href='B2C/$lang/Contact_detail.html?abc=$main_po_num'>$main_po_num</a>;

基本上发生的事情是第一个 (.) 被重写以插入到 $1 中,第二个 (.) 被替换到 $2 中。

所以,我又不是 100% 这是正确的语法,所以您可能需要查看它,但您应该能够执行以下操作:

RewriteRule ^B2C/(.*)/(.*).html/?(.*)$ index.php?lang=$1&p=$2&$3

【讨论】:

感谢您的建议。但是当我步行添加 QSA 标志时,它对我有用。但是,感谢您的解释,这可以帮助我更多地了解 htacess 文件

以上是关于由于 htaccess 文件而禁止传递变量的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 .htaccess 文件删除 .php 扩展名时出现 403 禁止错误

多个 .htaccess 文件中多个 mod_rewrite 规则的优先级是啥? [关闭]

Laravel 路由和 .htaccess 文件不适用于 1and1 托管

LANMP 如何禁止访问 .htaccess 文件

如何在 .htaccess 中将路径附加到 PHP include_path

使用 .htaccess 删除和禁止扩展名