.htaccess htaccess如果最后一个字符不是数字或斜杠,则重写/重定向

.htaccess htaccess如果最后一个字符不是数字或斜杠,则重写/重定向,.htaccess,.htaccess,我有一个网站,我有一个htaccess规则集来获取整个url,并使用下面的规则将其转发到我的索引文件,一切正常 ################################# # Magic Re-Writes DO NOT CHANGE # ################################# <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on #RewriteBase /

我有一个网站,我有一个htaccess规则集来获取整个url,并使用下面的规则将其转发到我的索引文件,一切正常

#################################
# Magic Re-Writes DO NOT CHANGE #
#################################
<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine on
  #RewriteBase /

  # Do Not apply if a specific file or folder exists
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  # The rules on how to rewrite the urls

  RewriteRule (.*) /index.php?url=$1 [QSA,L]
</IfModule>
#################################
#神奇的重写不会改变#
#################################
选项+FollowSymlinks
重新启动发动机
#重写基/
#如果存在特定文件或文件夹,则不适用
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
#关于如何重写URL的规则
重写规则(.*)/index.php?url=$1[QSA,L]
所以下面的规则是向前的

然而,我还需要确保我迎合了那些忘记url中尾随斜杠的人,这通常是直截了当的,然而,我需要能够强制最后一个尾随斜杠,前提是最后一个字符不是数字(或者很明显是斜杠)

例如,某人打字

我需要浏览器中的url显示为:

但仍需转发至:

如前所述,如果最后一个字符已经有尾随斜杠,或者是数字,则例外

(希望有道理)

好的,这是我到目前为止得到的

#######################################
#      Add trailing slash to url      #
#  unless last character is a number  #
#######################################

<IfModule mod_rewrite.c>
  RewriteEngine on
  Rewritecond %{REQUEST_URI} [^0-9/]$
  RewriteRule ^(.*)$ /$1/ [R=301,L]
</IfModule>

#################################
# Magic Re-Writes DO NOT CHANGE #
#################################
<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine on
  RewriteBase /

  # Do Not apply if a specific file or folder exists
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  # The rules on how to rewrite the urls

  RewriteRule (.*) /index.php?url=$1 [QSA,L]
</IfModule>
#######################################
#将尾部斜杠添加到url#
#除非最后一个字符是数字#
#######################################
重新启动发动机
重写条件%{REQUEST_URI}[^0-9/]$
重写规则^(.*)$/$1/[R=301,L]
#################################
#神奇的重写不会改变#
#################################
选项+FollowSymlinks
重新启动发动机
重写基/
#如果存在特定文件或文件夹,则不适用
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
#关于如何重写URL的规则
重写规则(.*)/index.php?url=$1[QSA,L]
问题是,虽然它似乎在url中添加了斜杠,但它也添加了index.php,因此我最终得到的结果是:

访问:

将url重写为:

添加了斜杠,但我需要它这样做,而不显示索引部分

我经历了反复,有许多不同的结果(通常是彻底的失败或循环)


您的规则是正确的,但即使在不应该的情况下,它也会盲目地重定向。您上面的URL可能不是要重写的URL。你可以这样说:

http://mydomain.com/index.php?url=players/scoresheet/singlegame/
但我敢打赌,这真的有点像:

# note the slash here--------v
http://mydomain.com/index.php/?url=players/scoresheet/singlegame/
因为在URI被内部重写并路由到
/index.php
之后,重写引擎再次循环,重定向捕获它,并将
/index.php
重定向到
/index.php/
。因此,您需要添加与路由规则中相同的排除条件:

因此,改变:

Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]
致:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]
或:


这就成功了,非常感谢你。我还以为我在那个儿会发疯呢。
RewriteCond %{REQUEST_URI} !index.php
Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]