.htaccess - mod重写htaccess问题

标签 .htaccess mod-rewrite url-rewriting

底部 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]

变化是:

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

关于.htaccess - mod重写htaccess问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66010302/

相关文章:

.htaccess - htaccess 仅针对某些页面重定向到 ssl,而 www 对于其他页面不安全

.htaccess - 仅允许来自特定 IP 地址的请求访问子域并将所有其他地址重定向到不同的 url - htaccess

php - WordPress 安装 404 错误(无法在浏览器中查看登录信息)

apache - 如何为 GET 请求正确配置 Apache 重写规则?

Apache mod_rewrite 域到子域?

apache - 重定向到另一台主机时使用 [L] 标志

php - 删除友好 URL 的 .php 扩展名(明确写入)

linux - nginx 配置 - 动态路由到根路径

apache - 将旧搜索重定向到新搜索并保留第一个参数

.htaccess 重写规则并在 url 中进行字符串替换