我有一堆不同类别的规则,这是一个类别...
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]
这很有用,因为如果您转到word /,则可以从publicWordsList.php获取内容-但是-如果直接转到/words/publicWordLists.php,则不会重定向回word /
那么如何在保持最初意图的同时阻止人们直接访问这些页面?
答案 0 :(得分:1)
您可以在文件的顶部创建一个“重定向”,该301将从“ ugly”文件系统路径重定向到所需的URL。但是,您需要注意重定向循环,因为稍后的 rewrite 会再次将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,则可以在 substitution 字符串的末尾附加一个?
(基本上是一个空查询字符串),以便从重定向的URL中删除查询字符串。 。例如,在 Apache 2.2 上,您需要使用它:
RewriteRule ^words/word\.php$ /words/%1? [R=302,L]