2011-07-27 6 views
0

목표 : 브라우저가 file-name.php로 재 작성되도록하려면 (존재하는 경우); 그렇지 않은 경우 파일 - name.html - 방문자가 다음 중 하나의 URL을 입력 여부 :.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 

그러나, 나는 기존의 웹 사이트와 함께 root에서 WP를 설치했으며 이러한 규칙은 더 이상 작동하지 않습니다.

무엇 WORK :file-namefile-name.html 또는 file-name.php 하나에 다시 작성 - 파일이 존재 중. 작동하지 않습니다 무엇

: 거기에 더 file-name.html없고 file-name.php이 경우에도file-name.htmlfile-name.php에 다시 작성되지 않습니다. 또한 file-name.phpfile-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.html'과 'file-name.php'가없는 경우 '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 페이지)에 대한 모든 요청에 ​​대해 평가되어 매우 바쁜 시간에 추가 압력을 가할 수 있습니다 섬기는 사람. 이상적으로는 적절한 URL을 가지고 있기 때문에 그러한 조작이 필요하지 않습니다.

+0

고마워, @ 레이즈 원. 나는 내 규칙을 WordPress 규칙 위에 두려고했지만 'file-name.php'가 없을 때 'file-name.php'는 여전히 404를 반환하지만 'file-name.html'이 있습니다. –

+0

@ user864464 로컬 Apache에서 규칙을 테스트했습니다. - 정상적으로 작동합니다. _Possibly_ 다른 규칙이 영향을 미칩니다. 아마도 WP 설치 - 나는 확실히 말할 수 없습니다. 가장 좋은 점은 - 디버깅 ('RewriteLogLevel 9')을 재 작성하고 로그를 다시 작성하여 서버에서 무슨 일이 일어나고 있는지 확인할 수 있습니다 (여기에 환경을 복제 할 수 없음). 내가 말했듯이, 여기서는 괜찮습니다.하지만 아파치 설정이 완전히 다른 것일 수 있다는 점을 감안할 때 다른 규칙에 따라 명령이 다르게 작동 할 수도 있습니다. – LazyOne

+0

@ user864464 나는 또한 원래 규칙 + 광산 규칙을 ​​시도했다 - 다시 잘 작동한다. 그것은 WP 규칙을 가진 무언가이거나 무언가 _completely_ 다른 것입니다 (나는 그것이 무엇이 될지 모르겠습니다). – LazyOne

관련 문제