[英]Rewrite htaccess rules not working perfect
我有很多不同类别的规则,这是一个类别......
RewriteRule ^words/$ /words/publicWordLists.php [L]
RewriteRule ^words/([A-Za-z]+$) /words/word.php?word=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/words/$ /words/userWordLists.php?username=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/words/([A-Za-z0-9-]+$) /words/list.php?username=$1&url=$2 [L]
这很有效,因为如果你转到 words/ 你从 publicWordsList.php 获取内容 - 但是 - 如果你直接转到 /words/publicWordLists.php - 它不会重定向回 words/
那么如何在保持我最初的意图的同时阻止人们直接访问这些页面呢?
您可以在文件顶部创建一个“重定向”,301 将其从“丑陋”文件系统路径重定向到所需的 URL。 但是,您需要小心重定向循环,因为稍后的重写会再次将 URL 重写回去。
例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^words/publicWordLists\.php$ /words/ [R=302,L]
对环境变量REDIRECT_STATUS
的检查可防止重定向循环,因为它只查看初始请求,而不查看重写的请求。 REDIRECT_STATUS
最初为空,但在第一次成功重写后设置为“200”。
仅在确认一切正常后才将302
(临时)更改为301
(永久) - 以避免潜在的缓存问题。
包含查询字符串的其他指令有点棘手,因为它们需要附加条件。 查询字符串不是与RewriteRule
模式匹配的 URL 路径的一部分。
例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^word=([a-zA-Z]+)$
RewriteRule ^words/word\.php$ /words/%1 [QSD,R=302,L]
以上重定向/word/word.php?word=<something>
到/words/<something>
。
%1
是对前面RewriteCond
指令中捕获的 URL 参数值的反向引用。 从重定向的请求中删除原始查询字符串需要QSD
标志。
更新: QSD
标志是 Apache 2.4+。 如果您仍在使用 Apache 2.2,那么您可以添加一个?
到替换字符串的末尾(本质上是一个空的查询字符串),以便从重定向的 URL 中删除查询字符串。 例如,在Apache 2.2 上,您将需要这个:
RewriteRule ^words/word\.php$ /words/%1? [R=302,L]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.