.htaccess 与不带正则表达式的RewriteRule完全匹配

u59ebvdq  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(147)

我有以下htacces重写一个精确的URL(views/index.php到views/index.xml):

RewriteEngine On
RewriteRule ^/views/index\.php$ /views/index.xml [L]

很容易忘记\并输入^/views/index.php$,允许使用 /views/indexXphp/views/index/php,而不是只允许使用 /views/index.php
对于我的情况,使用完全匹配而不是正则表达式就可以了,所以这是一种告诉Apache * 对于下面的所有RewriteRule/对于此RewriteRule,点表示a .而不是任何字符,因此点没有转义 * 的方法。
那么,有没有一种方法可以获得完全匹配的 /views/index.php 而不需要转义点?

vfwfrxfs

vfwfrxfs1#

正如Amal在您的问题下面评论的那样,regex中的点意味着任何字符,由于RewriteRule使用URI模式的正则表达式,因此您需要转义点,使其与文字点匹配。
但是在mod_rewrite规则中,您可以使用RewriteCond使其匹配文字字符串而不使用正则表达式在匹配模式之前使用=符号:
以下是已转换规则的示例:

RewriteCond %{REQUEST_URI} =/views/index.php
RewriteRule ^ /views/index.xml [L]
qqrboqgw

qqrboqgw2#

是的,您可以匹配/views/index.php,而不会转义点。
例如,可以使用/views/index[.]php,其中点位于字符类中。
此外,许多正则表达式标记允许您匹配点,而不需要特别要求句点。

  • .将匹配句点
  • [[:punct:]]将匹配句点
  • \D(不是数字)将匹配句点
  • \S(不是空白字符)将匹配句点
  • (?![-/])[--/]匹配一个句点(这是一个基于ASCII table的小范围的特别反常的正则表达式)
nnt7mjpx

nnt7mjpx3#

与公认的答案不同,下面的解决方案对我很有效:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(source)$
RewriteRule ^(.*)$ destination [R=301,L]

相关问题