我有一个看起来像的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=$1&dvc=$2 [NC,L,QSA]
RewriteRule ^read/([0-9a-zA-Z_-]*)([0-9a-zA-Z_-]*)$ read.php?uid=$1&dvc=$2 [NC,L,QSA]
RewriteRule
pattern中的路径段之间缺少斜线。
假设您的.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=$1&dvc=$2 [L,QSA]
[\w
是与[0-9a-zA-Z_]
相同的速记字符类,在其中添加了连字符(-
)。
由于URL /read
直接映射到文件/read.php
,因此必须禁用MultiViews,否则mod_negotiation在没有任何URL参数的情况下将请求“重写”到/read.php
(在mod_rewrite之前)。
请注意,我在第一个路径段中将量词从*
更改为+
,因为在您的URL中这似乎是必需的?
您的示例URL(/read/1234567/ABCDE
)在第一个路径段中显示数字,在第二个路径段中显示字母。如果这是对URL类型的准确反映,则应使regex更具限制性,以便仅检查此数据类型。
Aside:
RewriteEngine On # Turn on the rewriting engine
请注意,Apache不支持行尾注释。在这种情况下,这可能是“确定”,因为仅忽略了RewriteEngine On
之后的文本。在其他情况下,您可能会收到500个内部服务器错误。