ini 使用mod_rewrite(和mod_setenvif)通过temp env vars操作查询字符串参数的示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ini 使用mod_rewrite(和mod_setenvif)通过temp env vars操作查询字符串参数的示例相关的知识,希望对你有一定的参考价值。

# Mod_rewrite is great at manipulating HTTP requests.
# Using it to set and read temp env vars is a helpful technique.
#
# This example walks through fixing a query string:
# Extract good query params, discard unwanted ones, reorder good ones, append one new one.
#
# Before: /before?badparam=here&baz=w00t&foo=1&bar=good&mood=bad
# After: /after?foo=1&bar=good&baz=w00t&mood=happy
#
# Storing parts of the request (or anything you want to insert into it) in ENV VARs is convenient.
# Note the special RewriteRule target of "-" which means "no redirect; simply apply side effects"
# This lets you manipulate the request at will over multiple steps.
#
# In a RewriteRule, set custom temp ENV VARs via [E=NAME:value]
# Note it's also possible to set multiple env vars
# like [E=VAR_ONE:hi,E=VAR_TWO:bye]
#
# You can read these values using %{ENV:VAR_NAME}e <- little "e" is not a typo
#
# Tangent:
# Note you can also read these env vars the same way, if you set them via SetEnvIf[NoCase]
# (It won't work to use SetEnv, which runs too early for mod_rewrite to pair with it.)
#
# Regex details:
# (?:) syntax means "match but don't store group in %1 backreference"
#      so (?:^|&) is simply the ^ beginning or an & delimiter
#      (the only 2 possibilities for the start of a qs param)
# ([^&]+) means 1 or more chars that are not an & delimiter

RewriteCond %{QUERY_STRING} (?:^|&)foo=([^&]+)
RewriteRule ^/before - [E=FOO_VAL:%1]

RewriteCond %{QUERY_STRING} (?:^|&)bar=([^&]+)
RewriteRule ^/before - [E=BAR_VAL:%1]

RewriteCond %{QUERY_STRING} (?:^|&)baz=([^&]+)
RewriteRule ^/before - [E=BAZ_VAL:%1]

RewriteRule ^/before /after?foo=%{FOO_VAL}e&bar=%{BAR_VAL}e&baz=%{BAZ_VAL}e&mood=happy [R=301,L]

# That's it! No PHP needed! :)

使用 PHP 和 .htaccess (mod_rewrite) 管理 slug

【中文标题】使用 PHP 和 .htaccess (mod_rewrite) 管理 slug【英文标题】:Manage slugs with PHP and .htaccess (mod_rewrite) 【发布时间】:2020-11-25 13:39:12 【问题描述】:

让我们调用我的网站:

www.example.com

我有一个这样的 PHP 文件:

www.example.com/product.php?id=50

我想通过使用来访问它

www.example.com/product/50

但也很重要,我有几个子目录,例如

www.example.com/subsite/product.php?id=50
www.example.com/subsubsite/product.php?id=50

那必须变成

www.example.com/subsite/product/50
www.example.com/subsubsite/product/50

我怎样才能最好地使用 PHP 和 .htaccess 使用 mod_rewrite 来解决它? 我用this one之类的其他问题敲了敲头,但无济于事。

我似乎找不到完美运行的解决方案,处理所有导入的文件,如 CSS、JS 和 PHP 类。

【问题讨论】:

请发布您尝试并认为更正确的方法,以便我们检查错误。 【参考方案1】:

好的,所以这可能不是完整的答案,但应该可以帮助您找到自己的方式。

您可以使用正则表达式来匹配您想要的路径模式。因此,例如,您的 htaccess 可能看起来像...

# Check if module is installed
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /

# Check query for matching pattern and pass id, but also append additional query strings
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^([^\/]+\/)?product\/([0-9]+)$ /$1product.php?id=$2 [L,QSA]

# If not file or directory on server, send to 404.php
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /404.php [L]

</IfModule>

而它的作用是……

1.将 uri 与正则表达式模式匹配

正则表达式:^([^\/]+\/)?product\/([0-9]+)$

    ^ - 字符串开头。 ([^\/]+\/)? - 匹配任何目录(如果存在)并将其存储以供重复使用。 product\/([0-9]+) - 您想要的路径,例如product/50 并存储数字“id”以供重复使用。 $ - 字符串结束。

2。将捕获的目录和 id 传递给我们的文件

像这样:/$1product.php?id=$2 [L,QSA]

    $1 是我们的目录名称,包括尾部斜杠,例如subsubsite/ $2 是我们的产品 ID,例如50 [L,QSA] QSA 标志意味着我们可以访问其他查询字符串参数,例如/product/50?show=all&amp;updated=1。更多关于标志的信息可以在这里找到http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa

3. 404 不匹配

像这样:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /404.php [L]
    !-f如果请求不是文件 !-d如果请求不是目录 /404.php 用于显示 404 错误的文件。

正在获取 ID...

通过上述方法,您可以像这样在 product.php 文件中获取 ID:

$id = (int)$_GET[ 'id' ];

【讨论】:

不幸的是,这不起作用,因为所有包含的文件都没有加载。 @AlanPiralla 试试我更新的答案(包括 RewriteRule 上方的RewriteCond %REQUEST_FILENAME !-f 很好的解释。虽然重写为404.php 的第二条规则似乎不是这里的要求? (旁白:要实现 404“错误文档”,您应该简单地使用 ErrorDocument 404 /404.php,它也可以处理正确的 HTTP 状态。) 还是不行。所有包含的文件都是这样导入的:&lt;link rel="stylesheet" href="css/menu.css"&gt; 但在控制台中,所有导入的文件都给我一个 404,因为它们被重写如下:www.example.com/product/css/main.css

以上是关于ini 使用mod_rewrite(和mod_setenvif)通过temp env vars操作查询字符串参数的示例的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 和 mod_rewrite 强制 SSL/https

使用 PHP 和 .htaccess (mod_rewrite) 管理 slug

mod_rewrite 带问号和 & 符号(使用 PHP)

将 mod_rewrite 与 XAMPP 和 windows 7 - 64 位一起使用?

Apache mod_rewrite 和多个域

mod_rewrite:无法访问真实文件和目录