底部 4 条重写规则工作正常,但一旦我添加第一条规则,以便我可以从标准页面(例如 about.php)隐藏 .php 扩展名,那么最后一条规则就会停止工作? p>
根据最后一条规则,我希望 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,QSA,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]
变化是:
- 禁用
MultiViews
(内容协商),因为有两种情况php文件名与起始路径名相同,即/update
和/delete
. - 使用正则表达式将上述 2 条规则合并为一条规则
- 将
php
扩展规则放置在这些规则之后和最后一个前端 Controller 规则之前 - 最后一个前端 Controller 规则需要 2 个
RewriteCond
来跳过物理文件和目录。
关于.htaccess - mod重写htaccess问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66010302/