.htaccess将文件uri重写为file-name.html或file-name.php - 无论哪个存在

时间:2011-07-27 00:10:45

标签: .htaccess rewrite url-rewriting

目标:使浏览器重写为file-name.php(如果存在); else return file-name.html - 访问者是否输入了以下任何一个URL:

  1. http://mydomain.com/file-name
  2. http://mydomain.com/file-name.html
  3. http://mydomain.com/file-name.php
  4. 在我的.htaccess文件中使用以下规则取得了很好的成功:

    # REWRITE FILE URI TO file.php IF EXISTS
    Options Indexes +FollowSymLinks +MultiViews
    Options +ExecCGI
    RewriteEngine on
    RewriteBase /
    # parse out basename, but remember the fact
    RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes]
    # rewrite to document.php if exists
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.*)$ $1.php [S=1]
    # else reverse the previous basename cutout
    RewriteCond %{ENV:WasHTML} ^yes$
    RewriteRule ^(.*)$ $1.html
    

    但是,我已经在root用户上安装了WP,并且已经存在这些规则,这些规则已经不再适用了。

    工作内容: file-name会被重写为file-name.htmlfile-name.php - 无论哪个文件存在。

    什么不起作用 file-name.html即使没有file-name.php并且file-name.html也没有改写为file-name.php。此外,如果file-name.php没有file-name.html,则file-name.php不会被重写为file-name.html

    现在的整个.htaccess:

    # BEGIN WP MULTISITE RULES
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    
    # uploaded files
    RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
    
    # add a trailing slash to /wp-admin
    RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    RewriteRule  ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
    RewriteRule  ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
    RewriteRule . index.php [L]
    # END WP MULTISITE RULES
    
    # REWRITE FILE URI TO file.php IF EXISTS
    Options Indexes +FollowSymLinks +MultiViews
    Options +ExecCGI
    RewriteEngine on
    RewriteBase /
    # parse out basename, but remember the fact
    RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes]
    # rewrite to document.phtml if exists
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.*)$ $1.php [S=1]
    # else reverse the previous basename cutout
    RewriteCond %{ENV:WasHTML} ^yes$
    RewriteRule ^(.*)$ $1.html
    

    有什么建议吗?

1 个答案:

答案 0 :(得分:0)

快速概述告诉您原始规则很可能永远不会达到,因为WP规则应该拦截所有请求。

包含这些条件的这一行RewriteRule ^ - [L]将中止对任何现有文件或文件夹的重写,而此行RewriteRule . index.php [L]将拦截/重定向所有请求index.php

如果您将规则移到WordPress上面,那么它将再次起作用。


要将对不存在的.php文件的请求重写为.html文件,请使用以下规则:

# rewrite non-existing .php file to existing .html
RewriteCond %{DOCUMENT_ROOT}/$1.php !-f
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(.+)\.php$ $1.html [L,PT]

将其置于规则之下(但在WP之上)。该规则将检查.php文件是否不存在,只有存在.html文件时才会重写。如果两个文件都不可用,那么什么都不会发生。

请记住,由于这些检查以及规则位于重写链的顶部,因此将针对.php文件(甚至是WP页面)的每个请求评估此规则,这可能会给非常繁忙的服务器带来额外压力。理想情况下,您希望首先使用正确的URL,因此不需要进行此类操作。