【问题标题】:htaccess redirect fails with multiple URL parametershtaccess 重定向因多个 URL 参数而失败
【发布时间】:2017-08-04 20:11:10
【问题描述】:

我有以下 htaccess 文件:

RewriteEngine On
RewriteBase /

# Redirect to remove .php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

# Redirect to "page" for dynamic pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ page?url=/$1 [L]

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]

这允许我的自定义 CMS 使用动态 URL(例如 http://example.com/some-page)并将其重定向到 http://example.com/page?url=some-page,以便 CMS 可以呈现内容。这一切都很好 - 直到有人添加了一个像 http://example.com/something/else 这样的 URL。当我用 print $_GET['url']; 吐出 url 参数时,我得到 /something/else.php/else

所以看起来 remove .php 指令正在丢失并且第二个参数正在重复?感谢您的帮助。

【问题讨论】:

  • 可以从字符串中删除 .php 作为解决方案吗?
  • 第一条规则应该是这样做的——我知道一个可以正常工作,因为我有一些静态页面可以正常显示(没有 .php)。
  • "page?url=/$1 [L]" - 不应该是page.php吗? (否则,您将依赖 mod_rewrite 稍后通过另一个重写来添加扩展。)
  • 嗯,也试过了,没有运气 - 同样的问题。
  • (这不是一个解决方案,但它避免了不必要的重写。)/something 是物理目录,还是完全虚拟的? /something/else.php 存在吗?

标签: php apache .htaccess mod-rewrite


【解决方案1】:

这样吧:

Options -MultiViews
RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,NE,L]

RewriteCond %{ENV:REDIRECT_STATUS} =200
RewriteRule ^ - [L]

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

# Redirect to "page" for dynamic pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule !^page\.php$ page.php?url=%{REQUEST_URI} [L,NC,QSA]

以下是更改:

  1. 在重写规则之前保留重定向规则,否则当从 URL 中删除 www 时,您的内部 URL 将被暴露。
  2. 在目标中使用page.php 而不是page 以避免再次执行重写规则。
  3. .php 添加规则中使用[L] 标志。
  4. 添加Options -MultiViews

【讨论】:

  • 不幸的是,这会引发 500 内部服务器错误 - 但仅限于具有多个 URL 参数 (/something/else) 的页面。带有简单 /something URL 的页面就可以了。
  • 同样的问题 - page.php 位于站点根目录 (/public_html/page.php)。
  • 是的,只是这样做了 - 看起来错误是“AH00124:由于可能的配置错误,请求超出了 10 个内部重定向的限制。如有必要,请使用“LimitInternalRecursion”来增加限制。使用“LogLevel”调试'以获得回溯。”
  • 完成,不幸的是同样的问题。站点中有一些子目录,但 page.php 位于根目录中。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2022-10-23
相关资源
最近更新 更多