URL的htaccess重写规则

时间:2018-12-25 06:55:13

标签: regex .htaccess

我想要这样的格式化URL:

www.mysite.com/view.php?id=1

其中:

"id" range: 1-99 (without leading "0" from 1 to 9)
"id": always lowercase, no "Id" or "ID" or "iD"

任何与此格式不同的内容都必须将其重定向到 www.mysite.com/view.php 或格式为ID的值:

示例:

www.mysite.com/view.php?id=1sdeW --> www.mysite.com/view.php?id=1
www.mysite.com/view.php?erwrrw34 --> www.mysite.com/view.php
www.mysite.com/view.php?id=01 --> www.mysite.com/view.php?id=1
www.mysite.com/view.php?ID=33 --> www.mysite.com/view.php?id=33

我已经做了部分逻辑工作( RegExp htaccess 重写器):

请帮助完成以上完整的逻辑。

RewriteEngine On
RewriteCond %{QUERY_STRING} ID=([0-9]+)
RewriteRule ^(.*)$ /view.php?id=%1 [R=301,L]

编辑#1

我简化了获得相同结果的方法:

   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_URI} ^/view.php$
   RewriteCond %{QUERY_STRING} ^(?!(id=[1-9][0-9]{0,1})$).*$
   RewriteRule .* ? [R=301,L]

1)使用:

   RewriteRule .* ? [R=301,L]

它可以工作,但是链接位于我的网页内,指向:

   www.mysite.com/view.php

还重定向到:

   www.mysite.com

2)使用:

   RewriteRule .* /view.php? [R=301,L]

我收到了众所周知的“ TOO MANY REDIRECTS”循环。

我该如何摆脱呢?

1 个答案:

答案 0 :(得分:1)

主要是要确保您只处理以/view.php开头的URL。接下来,当您使用RewriteRule时,无需使用^(.*)$捕获URL。最后,将逻辑划分为较小的处理程序。

# Correct the wrong case for the "id" parameter
RewriteCond %{REQUEST_URI} ^/view.php$
RewriteCond %{QUERY_STRING} (ID|Id|iD)=(\d+)
RewriteRule . /view.php?id=%2 [R=301,L]

# Make sure that "id" contains only digits
RewriteCond %{REQUEST_URI} ^/view.php$
RewriteCond %{QUERY_STRING} id=([1-9]\d*)[^&]+
RewriteRule . /view.php?id=%1 [R=301,L]

# Check if the current URL contains "view.php?" but doesn’t have a valid "id" string
RewriteCond %{THE_REQUEST} ^[A-Z]+\s+/view.php\?
RewriteCond %{QUERY_STRING} !(id=[1-9])
RewriteRule . /view.php? [R=301,L]