htaccess重定向失败,有多个URL参数

时间:2017-08-04 20:11:11

标签: php apache .htaccess mod-rewrite

我有以下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使用动态网址(例如http://example.com/some-page)并将其重定向到http://example.com/page?url=some-page,以便CMS可以呈现内容。一切都很好 - 直到有人添加http://example.com/something/else之类的网址。当我使用:print $_GET['url'];吐出url参数时,我得到/something/else.php/else

所以看起来删除.php指令会丢失,第二个参数会重复?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

这样做:

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. 在重写规则之前保留重定向规则,否则当从网址中删除www时,您的内部网址就会曝光。
  2. 在目标中使用page.php而不是page,以避免执行其他重写规则。
  3. [L]添加规则中使用.php标记。
  4. 添加Options -MultiViews