【问题标题】:Passing variables through htaccess with a rewrite rule使用重写规则通过 htaccess 传递变量
【发布时间】:2014-03-26 21:14:38
【问题描述】:

我正在尝试重写以下内容

http://example.com/somefile?variable=somevariable

index.php?processurl=/somefile?variable=somevariable

我知道我需要使用 [QSA] 来传递变量,所以我在我的 htaccess 中编写了以下内容:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*) index.php?processurl=/$1 [QSA]

但是,这个 RewriteRule 似乎没有传递变量。我得到的只是 index.php?processurl=/somefile

【问题讨论】:

  • 尝试将新查询字符串中的 / 更改为 %2F,看看是否有帮助。 processurl=%2F$1
  • 您必须添加[L](最后一个)标志。试试[QSA,L]
  • 首先,它会重写为:index.php?processurl=/somefile&variable=somevariable 尽管这无关紧要,因为你永远不会看到它。 第二“我得到的只是 index.php?processurl=/somefile” 你从哪里得到的? 第三:你试过var_dump($_GET);吗?输出是什么?
  • @Steven Second:当我回显 $_GET[processurl] 时,我明白了。 第三:输出是array(2) { ["loadurl"]=> string(8) "/somefile" ["variable"]=> string(12) "somevariable" } 所以重写器正在正常工作,只是我的php没有占用整个字符串。例如,我怎样才能 echo all of $_GET[processurl],而不必 $_GET 所有单独的变量。感谢您的帮助。
  • 好的,我在下面添加了一个解决方案/说明,应该可以解决您的问题(假设我了解您要做什么)。

标签: apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

问题

问题在于您对QSA 标志的理解。这样做是将原始查询字符串附加到重定向的 URL。这在您希望将另一个参数(或多个)附加到查询字符串的某些情况下很有用。


示例

给定网址:

http://example.com/?var1=somevalue

然后是重写规则:

RewriteRule . /?var2=thisvalue
RewriteRule . /?var2=thisvalue [`QSA`]

会输出:

Rule 1 > http://example.com/?var2=thisvalue
Rule 2 > http://example.com/?var2=thisvalue&var1=somevalue

在您的情况下,问题是您不想将查询字符串附加为查询字符串,而是将其附加为变量;如果这是有道理的......

解决方案

然后解决方案是 - 听起来很简单 - 将查询字符串附加为变量......

你可以通过使用变量%{QUERY_STRING}来做到这一点:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*) index.php?processurl=/$1?%{QUERY_STRING}

建议

正如 anubhava 指出的,您可能想补充:

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

这样您就不会意外地重写错误的 url。

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php?processurl=/$1?%{QUERY_STRING}

【讨论】:

  • 很高兴知道。澄清一下,它是:%{Query_STRING}
  • 很抱歉再次提出这个问题,这个解决方案效果很好,但是它只传递了字符串中的第一个查询。 url 中的任何后续变量都将被忽略。如何将它们全部包含在内?
  • 你能发布一个例子 URL 哪里不起作用?
【解决方案2】:

你可以试试这个规则:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?processurl=/$1 [QSA,L]

【讨论】:

  • RewriteCond 是必要的吗?我觉得[L] 应该够了吧?
  • 需要避免重写css/js/images文件和已有目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2014-09-22
  • 2012-08-15
相关资源
最近更新 更多