mod重写htaccess问题

问题描述

底部的 4 条重写规则工作正常,但是一旦我添加了第一条规则,以便我可以在标准页面(例如 about.PHP)中隐藏 .PHP 扩展名,那么最后一条规则就停止工作了?

>

根据最后一条规则,我希望 URL 为 domain.com/123,但页面实际上是 /offer.PHP?id=123

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.PHP -f
RewriteRule ^(.*)$ $1.PHP
RewriteRule ^preview/([^/]*)$ /create-preview.PHP?id=$1 [L]
RewriteRule ^update/([^/]*)$ /update.PHP?id=$1 [L]
RewriteRule ^delete/([^/]*)$ /delete.PHP?id=$1 [L]
RewriteRule ^([^/]*)$ /offer.PHP?id=$1 [L]

解决方法

像这样:

Options -MultiViews
RewriteEngine On

RewriteRule ^preview/([^/]+)/?$ create-preview.php?id=$1 [L,QSA,NC]

RewriteRule ^(update|delete)/([^/]+)/?$ $1.php?id=$2 [L,NC]

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ offer.php?id=$1 [L,QSA]

变化是:

  1. 禁用 MultiViews(内容协商),因为有 2 种情况 php 文件名与起始路径名相同,即 /update/delete
  2. 使用正则表达式将上述 2 条规则合二为一
  3. php 扩展规则放在这些规则之后和最后一个前端控制器规则之前
  4. 最后的前端控制器规则需要 2 RewriteCond 才能跳过物理文件和目录。