重写htaccess规则无法正常运行

时间:2018-11-08 07:23:46

标签: php .htaccess

我有一堆不同类别的规则,这是一个类别...

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 /

那么如何在保持最初意图的同时阻止人们直接访问这些页面?

1 个答案:

答案 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]