繁体   English   中英

重写 htaccess 规则不完美

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM