由于 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 托管