【发布时间】: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