【问题标题】:Preserve query string in htaccess在 htaccess 中保留查询字符串
【发布时间】:2021-10-12 00:01:14
【问题描述】:

我有以下.htaccess 规则:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{QUERY_STRING} page=(.*)
    RewriteRule ^(.)([^/])([^/])[^/]*/$ /htcache/videos/$1/$2/$3/$0%{QUERY_STRING}.html? [L]
    RewriteRule ^$ /htcache/index.html [L]
    RewriteRule ^(.)([^/])([^/])[^/]*\.html$ /htcache/video/$1/$2/$3/$0 [L]
    RewriteRule ^(.)([^/])([^/])[^/]*\/$ /htcache/videos/$1/$2/$3/$0\index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

在此规则中,如果请求的 url 包含查询字符串并且文件在 htcache 文件夹中不存在,则重写规则起作用但查询字符串不执行

请求例如https://www.mywebsite.com/fun-videos/?page=2 如果文件存在/htcache/videos/f/u/n/fun-videos/page=2.html“找到文件”

但如果文件不存在,则页面/index.php 将在没有查询字符串的情况下执行。

一些想法???

【问题讨论】:

  • 尝试在您的规则中使用QSA 标志。 QSA 代表Query String Append

标签: apache .htaccess mod-rewrite


【解决方案1】:
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule ^(.)([^/])([^/])[^/]*/$ /htcache/videos/$1/$2/$3/$0%{QUERY_STRING}.html? [L]

这里的问题是,无论缓存文件是否存在,您都在重写“缓存文件”(并删除带有尾随 ? 的查询字符串)。

只有当“缓存文件”不存在时,你才会将已经重写的请求(没有查询字符串)重写为index.php

在重写之前,您应该首先检查缓存文件是否存在。虽然简单地删除第一条规则的尾随 ? 将阻止查询字符串被删除。

另请注意,条件只是检查page=是否存在于查询字符串中的任何位置,而不是严格来说是否存在page URL参数——如果这很重要的话。

RewriteRule ^(.)([^/])([^/])[^/]*\/$ /htcache/videos/$1/$2/$3/$0\index.html [L]

除此之外:TestString(第一个参数)和\i 中的替换 中的最后一个斜杠无需反斜杠转义> 字符串只是一个文字 i - 除非它真的应该是 /i?

例如,改为这样尝试:

RewriteEngine On

RewriteCond %{QUERY_STRING} page=
RewriteCond %{DOCUMENT_ROOT}/htcache/videos/$1/$2/$3/$0%{QUERY_STRING}\.html -f
RewriteRule ^(.)([^/])([^/])[^/]*/$ /htcache/videos/$1/$2/$3/$0%{QUERY_STRING}.html? [L]

RewriteRule ^$ /htcache/index.html [L]

RewriteCond %{DOCUMENT_ROOT}/htcache/video/$1/$2/$3/$0 -f
RewriteRule ^(.)([^/])([^/])[^/]*\.html$ /htcache/video/$1/$2/$3/$0 [L]

RewriteCond %{DOCUMENT_ROOT}/htcache/videos/$1/$2/$3/$0index.html -f
RewriteRule ^(.)([^/])([^/])[^/]*/$ /htcache/videos/$1/$2/$3/$0index.html [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

您实际上并没有在这里使用RewriteBase 指令,因此我将其删除。

【讨论】:

  • 感谢 mrwhite,但我不明白 .... 规则仅在缓存为空时才有效 ... 如果页面 mywebsite.com/fun-videos/ 被缓存,在“/htcache /videos/f/u/n/fun-videos/index.html",所有带有查询字符串的下一个请求页面都返回非查询字符串结果
  • @remi“规则仅在缓存为空时有效” - 但在您的问题中您说:“如果文件 not 存在页面 /index.php 被执行没有查询字符串”。您是否尝试过我的回答中的指令?正如我的回答中所述,您的规则的问题之一是您正在重写缓存文件无条件,无论缓存文件是否实际存在。当缓存文件不存在时,请求将被第二次重写。这里应该只有一次重写。
  • @remi 当page= URL 参数存在时,您想在从缓存中请求页面时删除查询字符串?或者后面的? 完全错误? (尽管我在回答中也提到了这一点。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2012-10-10
  • 2018-05-11
相关资源
最近更新 更多