.htaccess - 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,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
(内容协商),因为在 2 种情况下 php 文件名与起始路径名相同,/update
即/delete
. - 使用正则表达式将上述 2 条规则合并为一条
php
在这些规则之后和最后一个前端控制器规则之前放置扩展规则- 最后一个前端控制器规则需要 2
RewriteCond
来跳过物理文件和目录。
推荐阅读
- python - 函数的monkeypatching中的setattr抛出属性错误
- angular - 递归调用角组件时,mat-accordion 滞后
- html - Django分页问题 - 页面没有分页
- android - 在 android 的 Sqlite 数据库中插入记录后立即启动 API 调用
- string - 在scala中将字符串转换为大写
- android - (Android) OkHttpClient基于url缓存(不同url缓存不同)
- python - 在 Python 中将变量和方程结果存储在字典中
- c++ - 我正在尝试将 char* 转换为 float*
- php - 无法在 Codeigniter 中调整水印图像的不透明度和大小
- swift - 如何在运行时添加或删除 safari 内容阻止列表的规则