多个参数的 htaccess 重写规则

htaccess Rewriterule for multiple Parameters

我有一个 URL 看起来像:

https://www.example.com/project/api/read.php?uid=1234567&dvc=ABCDE

我想建立一个重写规则,将 URL 变成:

https://www.example.com/project/api/read/1234567/ABCDE

我的尝试是这样的:

RewriteEngine On    # Turn on the rewriting engine
RewriteRule ^read/([0-9a-zA-Z_-]*)([0-9a-zA-Z_-]*)$ read.php?uid=&dvc= [NC,L,QSA]
RewriteRule ^read/([0-9a-zA-Z_-]*)([0-9a-zA-Z_-]*)$ read.php?uid=&dvc= [NC,L,QSA]

您在 RewriteRule 模式 中的路径段之间缺少斜杠。

假设您的 .htaccess 文件位于 /project/api 子目录中(正如您的指令所暗示的那样),然后尝试以下操作:

# MultiViews must be disabled for the rewrite to work
Options -MultiViews

# Turn on the rewriting engine
RewriteEngine On

RewriteRule ^read/([\w-]+)/([\w-]*)$ read.php?uid=&dvc= [L,QSA]

\w 是一个 shorthand 字符 class 与 [0-9a-zA-Z_] 相同,我们在其中添加连字符 (-).

由于URL/read直接映射到文件/read.php必须禁用MultiViews,否则mod_negotiation"rewrites"请求/read.php(在 mod_rewrite 之前)没有任何 URL 参数。

请注意,我在第一个路径段中将量词从 * 更改为 +,因为这在您的 URL?

中似乎是强制性的

您的示例 URL (/read/1234567/ABCDE) 在第一个路径段中显示数字,在第二个路径段中显示字母。如果这是 URL 类型的准确反映,则应使正则表达式更具限制性以仅检查此数据类型。

旁白:

RewriteEngine On    # Turn on the rewriting engine

请注意,Apache 不支持行尾注释。在这种情况下,这可能是 "OK",因为 RewriteEngine On 之后的文本被简单地忽略了。在其他情况下,您可能会收到 500 内部服务器错误。