2017-08-04 73 views
2

我有以下htaccess文件: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。当我吐出url参数:print $_GET['url'];我得到/something/else.php/else

所以看起来像删除.php指令迷路了,第二个参数重复?谢谢你的帮助。

+0

能removeing从字符串.php为是一个解决办法? – GrumpyCrouton

+0

第一条规则应该是这样做的 - 我知道一个是因为我有几个静态页面可以很好地显示(没有.php)。 –

+0

“'page?url =/$ 1 [L]'” - 不应该是'page.php'吗? (否则,你正在依靠mod_rewrite以后再添加扩展与另一个重写。) – MrWhite

回答

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从URL那么你的内部URL将被暴露删除。
  2. 在目标中使用page.php而不是page以避免执行另一个重写规则。
  3. 使用[L]标志.php添加规则。
  4. 加成Options -MultiViews
+0

不幸的是,这会引发500个内部服务器错误 - 但仅限于具有多个URL参数(/ something/else)的页面。带有简单/某些网址的网页很好。 –

+0

同样的问题 - page.php位于网站根目录(/public_html/page.php)。 –

+0

是的,只是这样做 - 看起来像错误是“AH00124:由于可能的配置错误,请求超过了10个内部重定向的限制,使用'LimitInternalRecursion'来增加限制,必要时使用'LogLevel debug'来获得回溯。 “ –