【问题标题】:Rewrite PHP query string?重写 PHP 查询字符串?
【发布时间】:2015-12-22 10:02:17
【问题描述】:

我已经搜索了使用服务器根目录中的 .htaccess 文件重写 URL 的其他解决方案,但是这种语言让我很困惑,而且我似乎无法让它工作。我将如何改变:

http://domain.com/share.php?media=059ogbuq70

到:

http://domain.com/059ogbuq70

我找到了类似的代码,并尝试了,但它似乎不起作用:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^media=([0-9]+)$
RewriteRule ^$ share.php?media=$1 [QSA,L]

我的 PHP:

<?php
$media_id = $_GET['media'];
$url = file_get_contents("https://api.wistia.com/v1/medias/" . $media_id . ".json?api_password=my_key");
$json = json_decode($url, true);
$name = $json[name];
$origimg = $json['thumbnail'][url];
list($image, $size) = explode('?', $origimg);
$video = $json['assets'][5][url];
?>

然后我 echo 在我的页面上需要它们的变量。

谢谢!

【问题讨论】:

  • 我很困惑。您重写 URL 以包含查询字符串,但前提是查询字符串存在。是否要从第一个 URL 重定向到第二个 URL?
  • 基本上我希望漂亮的 url 只显示给用户,而真正的 url 是由服务器/php 使用的
  • 您是否还想将“丑陋”的网址重定向到相应的“漂亮”网址?
  • 不,我只需要domain.com/[some-string]domain.com/share.php?media=[some-string] 一样行事

标签: .htaccess


【解决方案1】:

要在内部重写“漂亮”的 URL 以便将查询字符串传递给 PHP,我建议使用以下 .htaccess 文件:

RewriteEngine on
RewriteRule ^([^/]+)/?$ share.php?media=$1 [L]

正则表达式匹配:
一个或多个不是反斜杠的字符,后跟可选的反斜杠。

除了可选的尾部斜杠之外的所有内容都在$1 中捕获并重写为“媒体”查询字符串变量。

例如:

http://domain.com/059ogbuq70/
内部重写为
http://domain.com/share.php?media=059ogbuq70

这意味着:

$_GET['media'] = 059ogbuq70


您可能会发现此 mod_rewrite cheat sheet 有助于构建您的正则表达式。
另外,你可以在这里test your rewrites

【讨论】:

  • 感谢您的回答,但这不是重写 URL,而是干扰我的 PHP(从 URI 参数 media= 获取变量)。
  • 也许还有其他事情发生,或者我不明白你的目标是什么。重写是内部的,因此您不会在浏览器中看到 URL 更改(重定向)。它似乎在工作here。将您的 PHP 代码编辑到您的问题中可能会有所帮助。
  • 我已更正,输入 URL:domain.com/[some-string] 似乎工作正常,但我在 PHP 的第 3 行调用 $media_id 变量时遇到问题。在 URL 重写之前它工作得很好,如果我删除 .htaccess 就可以了
  • $media_id 有和没有.htaccess 文件的值是多少?
  • 鉴于您的代码,我看不出有任何方式将 $_GET 变量设置为“失败”。 “失败”是status values Wistia returns 之一。你确定这是$media_id 的值吗?这很快就偏离了原始问题。也许最好问一个新问题?
【解决方案2】:

您需要two 规则来执行您要执行的操作。你可以把它放在名为.htaccess的文件中

RewriteEngine on

#redirect all old URLs to the new rewritten URL
RewriteCond %{THE_REQUEST} ^GET\ /+share\.php\?media=([^&\ ]+)
RewriteRule ^ /%1? [R=302,L]

#rewrite folder path internally to share.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ share.php?media=$1 [QSA,L]

【讨论】:

  • 感谢您的回答,但这个重定向到:http://vipheo.com/fs6e/vipheo/public/83s371n1yi%20HTTP/1.0 并给我一个 404。有什么帮助吗?
  • @user1661677 是的,抱歉,我更正了规则。小错误。现在整个规则完成了。如果您没有这样的规则,用户仍然可以使用http://example.com/share.php?media=13e43 样式的 URL。
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2011-08-02
  • 2011-04-07
  • 2010-11-16
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多