.HTACCESS优先考虑代码。它在第一次统治后忽略了一切

时间:2014-12-29 04:28:36

标签: regex apache .htaccess mod-rewrite

为什么我不能在.HTACCESS中保留所有这些内容?

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?id=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?id=$1

// this code below wont work, But if remove the upper code, 
//It works fine. What could be the reason ?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)/?$ $1.php [L]

在我看来,它在某种程度上优先考虑第一行并忽略后面的行。该怎么办 ?

  在第一个,我清理URL
  第二步 - 试图隐藏分机。


  谢谢!

3 个答案:

答案 0 :(得分:1)

由于您在第一个规则中使用模式[a-zA-Z0-9_-]+匹配几乎所有内容,因此该规则会覆盖第二个规则。最好在第一个规则之前移动第二个规则,并在添加.php扩展名之前检查相应的.php文件是否存在。

请尝试以下规则:

RewriteEngine On

# To internally forward /dir/file to /dir/file.php
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f [NC]
RewriteRule . %{REQUEST_URI}.php [L]

# your first rule    
RewriteRule ^([\w-]+)/?$ user.php?id=$1 [L,QSA]
  • %{DOCUMENT_ROOT}%{REQUEST_URI}\.php表达式用于构建.php文件
  • 的完整路径
  • -f用于检查.php文件是否存在
  • \w[a-zA-Z0-9_]
  • 相同
  • QSA(查询字符串追加)标记在添加新查询参数时保留现有查询参数。

答案 1 :(得分:0)

首先评估重写规则。如果模式为真,则将检查条件。如果删除前两个重写规则,则最后一次重写规则将评估为true并检查条件。

答案 2 :(得分:0)

我认为您需要使用RewriteEngine On[L, QSA]

执行此操作

QSA将查询字符串追加到末尾。 L意味着,在此之后不再处理任何规则'。 第二个RewriteEngine On将其重新打开。

我可能对此非常误导,但......它应该有效。 然而,在决定为您的用户链接进行SEO优化方面做得很好!

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?id=$1 [QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?id=$1 [L,QSA]


RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)/?$ $1.php [L]