2011-04-21 4 views
10

'slash'가 없으면 .html 확장자를 추가하는 규칙이 필요합니다..html 확장자를 추가하는 재 작성 규칙

새로운 고객이 최근에 전자 상거래 스크립트를 변경했으며 새 버전은 SEO를 다르게 처리하고 16,000 개 이상의 제품 링크를 모두 변경했습니다. 이

이 domain.com/category/productname 같은 링크를 가지고하는 데 사용되는 모든 제품하지만 지금 도메인입니다 .. 사이트에 이전에 우리가 새에 이전 리디렉션 할 필요가 그래서 다시 색인 적발되지 않았다 .COM/카테고리/productname.html

종류의 링크가 변경되지 않았고 모두가 (후행 슬래시)이 domain.com/category/처럼

답변

4
 
RewriteEngine On 
RewriteCond %{REQUEST_URI} ! \.html$ 
RewriteCond %{REQUEST_URI} ! /$ 
RewriteRule ^(.*)$ $1.html 

당신이 [R]을 던져 할 수 있습니다 거기, 또는 무언가. docs : http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule ("redirect | R"으로 검색)을 참조하십시오.

+0

,이 (끝에 [R = 301, L]를 추가하는 등) 해봤 I는 500 얻을 모든 요청에 ​​대한 오류. 나는 서버에서 간단한 RewriteRule을 시도해 보았다. 그래서이 서버에있는 .htaccess/mod_rewrite의 일반 구성이 아니라 결함이 있다고 가정한다. – greggles

14

@ david-wolever의 대답은 .html (또는 루트)로 끝나지 않는 모든 항목을 .html 확장자가 추가 된 동일한 URL로 리디렉션합니다. 즉, CSS 및 JavaScripts 파일에 .html 확장자를 추가합니다 , 예. /style.css를 /style.css.html로 리디렉션합니다. 그것은 또한 뒤에 공백이 있습니다! 문자 가능성이 발생합니다 @greggles의 500S

이 3 개 또는 4 영숫자 문자 뒤에 점에서 끝나지 않는 URL을 리디렉션 : 화이트리스트,

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{3,4} 
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule ^(.*)$ $1.html 

또는 미세한 입자 제어를 원하지 않는 확장 .html 추가 예 : .htaccess 섹션에서
http://www.garron.me/bits/add-html-extension-nginx-apache-htaccess.html
:

RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif)$ 
+0

한 URL 만 이스케이프 처리 할 수 ​​있습니까? 왜냐하면 나는 이것을 WordPress 사이트에서 사용하기 때문에 관리자 페이지로 갈 수 없기 때문입니다. 사촌 내가 "도메인/wp - admin"을 도메인/wp-admin.html로 리다이렉트하고 404를 반환 할 때 입력하십시오. 동일한 문제가이 스레드의 모든 대답과 함께 발생합니다. –

+0

불행히도 이것은 해시 조각이있는 URL에서 작동하지 않습니다. 이것은 –

1

위의 솔루션은
내가에서 일하는 해결책을 발견, 나를 위해 작동하지 않았다.

RewriteCond % {REQUEST_URI}!^.html 중에서 $한다 RewriteCond % {REQUEST_FILENAME}! -f한다 RewriteCond % {REQUEST_FILENAME}는! 한다 RewriteRule을 -d (^.) $ $ 1.html [L, R = 301]

6

이 옵션과 유사한 @ remco 's이지만, [R] ("외부"리다이렉트가 다시 브라우저로 전송 됨)을 사용할 필요가 없습니다. @ paul.grov.es의 대답은 나를 위해 잘 작동하는 것 같았다

Options FollowSymLinks 

RewriteEngine On 
RewriteCond %{REQUEST_URI} !^.*\.html$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html 
2

,하지만 난 내 자바 스크립트가 더 이상 작동하지 않는 것을 발견 : 나는 또한 첫 번째 조건에 누락 된 \를 추가했습니다.

해결 방법은 분명하고 그 사람이 언급했습니다. javascript 확장에 2 개의 문자 만있는 경우 '.html'이 URL에 추가되었습니다.

그래서, 내 솔루션으로 밝혀졌다 :

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{2,4} 
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule ^(.*)$ $1.html 
+0

의 적용 범위입니다. 다른 답변은 .html과 다른 확장명으로 끝나는 URL의 존재를 확인하지 않기 때문에 실제로 올바른 대답입니다. 디렉토리를 검사하고 디렉토리인지 확인합니다. '''RewriteCond % {REQUEST_URI}!/$'''에서''RewriteCond % {REQUEST_FILENAME}! -d''로 변경하면됩니다. –

3

이 옛 스레드이지만이 문제에 대한 작업/테스트 답변을 게시 여전히 가치가있다 :

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^.]+?)/?$ /$1.html [L,R=302] 

이후 RewriteCond %{REQUEST_FILENAME} !-f 조건을 건너 뛰었을 regex 패턴이 어떤 URI와 도트가 일치하지 않습니다.

는 Nginx에 대한
+0

내 사이트에서 현재 example.com/test 및 example.com/test.html을 사용할 수 있습니다. 나는 HTML이 아닌 모든 것을 강제로 .html로 보내기를 원한다. 위를 사용하고 302에서 301로 변경할 수 있습니까? – user1040259

+0

네, 믿을 만합니다. – anubhava

+0

감사합니다! 과거에 도움을 받았다면 설정을 되돌려 야합니다. 고맙습니다. http://stackoverflow.com/questions/39092679/htaccess-301-redirect-to-html – user1040259

0

내 용액 :

강제 .html 중에서 내선 그래서

if ($request_filename !~ ^.+(.html|\/)$) { 
    return 301 $scheme://$host$request_uri.html; 
}