Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 用mod_Rewrite重写URL_Apache_.htaccess_Mod Rewrite_Rewrite - Fatal编程技术网

Apache 用mod_Rewrite重写URL

Apache 用mod_Rewrite重写URL,apache,.htaccess,mod-rewrite,rewrite,Apache,.htaccess,Mod Rewrite,Rewrite,我需要从http://example.com/file.php?id=test&cat=category至http://example.com/file?test&cat=category 我仅通过以下方法将路径/file.php重写为/file: RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^/?(\

我需要从
http://example.com/file.php?id=test&cat=category
http://example.com/file?test&cat=category
我仅通过以下方法将路径
/file.php
重写为
/file

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^/?(\w+)$ $1.php [QSA,NC,L]

如何重写URL的其余部分?第二个问题:是否可以阻止默认URL访问,以便用户必须使用重写的URL?

要检查查询字符串中的值,您需要使用带有
query\u string
变量的RewriteCond,如下所示:

RewriteCond %{QUERY_STRING} ^([a-z]+)&cat=([a-z]+)$
RewriteRule ^([a-z]+)$ $1.php?id=%1&cat=%2 [L]
这意味着,只有当查询字符串包含一组连续的小写字母,后跟一个符号,然后“cat=”后跟另一组连续字母时,才必须执行重写规则。捕获组可以在下一个重写规则中使用
%1
%2
,如下所示:

RewriteCond %{QUERY_STRING} ^([a-z]+)&cat=([a-z]+)$
RewriteRule ^([a-z]+)$ $1.php?id=%1&cat=%2 [L]
您不想使用
QSA
标志,因为这会将用户的无效查询字符串附加到重写URL的末尾。您可能仍然希望使用
NC
标志忽略匹配模式中的大小写,但如果可能,最好只使用小写文件名


关于阻止对最终(.php)路径的请求,我想不出一种方法来实现这一点,因为即使是最终的URL也必须通过.htaccess规则运行,因此禁止访问它会破坏重定向。

感谢您的回答,它确实帮了我很多忙。