.htaccess规则冲突有帮助

时间:2009-10-06 04:01:43

标签: .htaccess mod-rewrite

嘿伙计们,我正在努力实现我在几天前在这里问到的另一个问题的答案之一。您可以在此处找到原始问题:Mod_rewrite clarification question. Only for dynamic urls?

最有用的答案和我正在建模后的实现如下:

  

我猜测meder给出的答案是你正在寻找的那个,但从技术上讲,你可以创建一个静态映射文件来将一组标题字符串重定向到id,它不必执行外部prg可执行文件:

  RewriteMap static-title-to-id txt:/tmp/title_to_id.txt
  RewriteRule ^/health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
     

/tmp/title_to_id.txt文件的内容如下:

  how-do-I-lose-10kg-in-12-weeks 999
  some-other-title 988
  and-another 983

足够好的背景。我的.htaccess文件目前包含以下内容:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

它是典型的wordpress永久链接定制。但是,当我尝试添加类似于上面选定答案中提供的规则时,我收到内部服务器错误。

当我收到内部服务器错误时,这是​​我的.htaccess文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteMap static-title-to-id txt:/tmp/title_to_id.txt
RewriteRule ^/health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
</IfModule>

我希望我的问题很简单,比如规则冲突。如果你能看到错误或者可以在这里提供一些方向,那将非常感激。

1 个答案:

答案 0 :(得分:1)

您的代码中有四个错误:

  1. RewriteMap direction只能在server configuration or virtual host context中使用。

  2. 在.htaccess文件中使用mod_rewrite时,mod_rewrites首先从URL路径中删除每个目录前缀,然后再测试规则并在应用规则后重新添加。如果.htaccess位于根目录中,则路径前缀将被删除/。因此,您需要指定不带前缀的路径模式:

    RewriteRule ^health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
    
  3. 您的规则的替换也将与该规则相匹配。这将导致无限循环。因此,您需要更改模式或替换以避免这种情况。在您的情况下,更改模式会更好,例如:

    RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
    

    您还应指定网址路径的结尾:

    RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/$ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
    
  4. 由于我假设这些URL无法直接映射到现有文件或目录,因此您的第一条规则将在重写之前捕获它们。因此,您应该更改该规则的顺序,以便在catch-all之前应用特定规则:

    RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/$ /health-and-fitness-tips/${static-title-to-id:$1}/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]