2011-07-27 28 views
0

目標:要使瀏覽器重寫爲file-name.php,如果存在;否則返回文件name.html - 訪問者是否已經輸入的網址爲下列任何一個:.htaccess將文件uri重寫爲file-name.html或file-name.php - 無論哪一個存在

  1. http://mydomain.com/file-name
  2. http://mydomain.com/file-name.html
  3. http://mydomain.com/file-name.php

曾與下面的規則很好的成功在我的.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 

不過,我已經在根目錄安裝了WP,並與原有的網站一起安裝,這些規則不再有效。

是什麼工作:file-name被改寫要麼file-name.htmlfile-name.php - 無論文件存在。

什麼行不通:file-name.html即使沒有file-name.htmlfile-name.php有沒有改寫爲file-name.php。另外,當沒有file-name.php時,file-name.php不被重寫爲file-name.html,但是存在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 

有何意見?

+0

是的,我移動了WP上面的規則,它再次工作。大多。也就是說,'file-name'返回'file-name.html'或'file-name.php' - 無論哪個存在,'file-name.html'將返回'file-name.php'(如果存在)。但'file-name.php'如果只有'file-name.html'而沒有'file-name.php'則返回404。在這種情況下,什麼會導致'file-name.php'重寫爲'file-name.html'? –

回答

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頁面)的請求評估此規則,這可能會對非常繁忙的應用程序施加額外的壓力服務器。理想情況下,您希望首先擁有正確的網址,這樣就不需要這種操作。

+0

謝謝,@LazyOne。我嘗試將您的規則放置在我的以下和WordPress規則之上,但'file-name.php'在沒有'file-name.php'但仍有'file-name.html'時仍返回404。 –

+0

@ user864464我已經測試了我的本地Apache規則 - 工作非常好。 _可能_一些其他規則影響它..也許你的可溼性粉劑安裝 - 我不能肯定地說。最好的事情 - 啓用重寫調試('RewriteLogLevel 9')並檢查重寫日誌以查看服務器上發生了什麼(我無法在此複製您的環境)。正如我所說 - 它在這裏工作正常..但在其他規則的禁令,它可能工作不同,考慮到你的Apache設置可以完全不同於我的事實。 – LazyOne

+0

@ user864464我也嘗試了您的原始規則+我的規則 - 再次正常工作。它必須是WP規則的東西..或完全不同的東西(我不知道它可能是什麼)。 – LazyOne