【问题标题】:UrlSearchParams.get() doesn't work with rewritten urlsUrlSearchParams.get() 不适用于重写的 url
【发布时间】:2019-09-04 08:18:10
【问题描述】:

在我的网站上,我重写了所有网址。但是现在我已经开始使用 AJAX 来实现投票功能(它是一个问答社区),存在一些问题:

我将new UrlSearchParams(window.location.search) 存储在一个常量中。然后我为此调用.get() 方法。但是,由于 url 被重写,它无法识别查询。

const myParam = urlParams.get('id');

网址是www.example.com/Questions/7改写自www.example.com/pages/question.php?id=7

我的 .htaccess 文件如下所示:

RewriteEngine On    # Turn on the rewriting engine
Options -MultiViews
RewriteRule ^$ /pages/index.php [L]
RewriteRule    ^users/([0-9]+)$    pages/profile.php?id=$1   [NC]    # Handle users
RewriteRule    ^questions/([0-9]+)$    pages/question.php?id=$1   [NC]    # Handle questions
RewriteRule    ^([A-Za-z_]+)$       pages/$1.php                    [NC]    # Handle pages
RewriteRule    ^([A-Za-z_]+)$       pages/$1.html                    [NC]    # Handle pages

如何克服 URL 重写时 UrlSearchParams 无法识别查询字符串数据这一事实?

【问题讨论】:

  • 我用的是localhost根目录下的.htaccess文件
  • 您必须通过解析 window.location.pathname 来更改它以匹配新的 URL 格式……或者只是在 HTML 中的某个地方从 PHP 传递它,这可能更简单、更灵活。
  • 如果 URL 被重写,则不能使用相同的代码从 URL 中获取信息。你需要不同的代码。在你的情况下,location.pathname.substring(location.pathname.lastIndexOf('/'))...
  • 解析路径名的替代方法是在脚本标签中传递一个小对象变量
  • 把这个放到你的<head>部分~<script>const ID_PARAM = <?= json_encode($_GET['id'] ?? null) ?></script>

标签: javascript query-string querystringparameter


【解决方案1】:

您的重写规则所有内部重写,这意味着客户端代码只能看到原始 URL,即/Questions/7

由于您的 PHP 运行在服务器端,并且可以看到重写的查询参数,因此您可以直接将它们作为 JS 变量注入,供您的客户端代码使用。

例如,把它放在你的<head> 部分...

<script>
const ID_PARAM = <?= json_encode($_GET['id'] ?? null) ?>;
</script>

【讨论】:

  • 所以我可以使用 json_encode() 函数将 any PHP 注入 JavaScript just 吗?
  • @Marvin json_encode() 只是以在 JS 中安全使用的方式格式化值
  • = ?> 是脚本标签中 php 标签的变体吗?
  • &lt;?=&lt;?php echo 相同。见What does '<?=' mean in PHP?
  • 太棒了!另外,“使用安全”是什么意思?像减少安全漏洞?
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 2013-09-18
  • 2019-03-13
  • 2012-10-05
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多