2011-07-27 16 views
11

は私がやらなければならないことは、私のURL 場合に敏感なを作るです...のmod_rewriteと.htaccessに苦しんでいます。 500台の内部サーバーエラーが発生し、たくさんのスタックオーバーフローが発生した後、私はただ1つの解決策を探しています。大文字と小文字を区別するURL - どのように区別しないのですか?

ませ作業:Convert to lowercase in a mod_rewrite rule

RewriteMap tolower int:tolower 
RewriteRule ^([^/]+)/?$ somedir/${tolower:$1} 

ませ作業:Case Insensitive URLs with mod_rewrite

CheckSpelling on 

私に必要なのは単純ではない、大文字と小文字を区別するURLです:)

+1

/var/www/vhosts/domain.com/conf/vhosts.conf [マニュアル](http://httpd.apache.org/docs/current/mod/mod_rewrite.html#を読みます'RewriteMap' ** .htaccessで宣言することはできません - サーバ設定または仮想ホストコンテキストでのみ宣言できます。それ以外の場合 - ルールは正常です。 – LazyOne

+0

HMMM ...本当に理解しないでください。私は共有ホスティングを使用していますが、私はSSH経由でコンソールにアクセスする必要はありません。サーバ設定については言及していません... –

+0

Easy:この行を 'RewriteMap tolower int:tolower'に入れると.htaccess、あなたは500サーバーエラーを取得します。 – LazyOne

答えて

4

次のように動作するはずです:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    rewritemap lowercase int:tolower 
    RewriteCond $1 [A-Z] 
    RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L] 
    </IfModule> 

もしそうでない場合は、提案されたソリューションについて何が問題になるのかを説明できますか?あなたの.htaccessファイルでこれを入れて

+0

私はdomain.comとdomain.com/stuff ** domain.com ** - 作品 ** domain.com /もの** - 500内部サーバーエラー ** domain.com /スタッフ** - domain.comのindex.html、CSSおよび画像が正しくロードされていないことを示しています 奇妙なのですか? –

+0

@Michal Stefanow Linuxは大文字と小文字を区別するOSです。リンクを適切に入力する必要があります。そのため、ほぼすべての人がファイルやフォルダに小文字の名前を使用していることがわかります。間違いをする機会は少なくなります。 – LazyOne

+3

私は私のURLを防弾にしたいと思います。 CamelCaseは目玉ですので、愚かな404エラーページがなくても、時々使いたいと思います。 –

0

ErrorDocument 404 /notfound.html 
AddType application/x-httpd-php .html 

はnotfound.htmlでこれを入れて:

<?php 
$tdir=getdir("/",$_SERVER['REQUEST_URI']); 
if($tdir!=false) 
{ 
    header("HTTP/1.1 301 Moved Permanently"); 
    header('Location: http://yourdomain.com'.$tdir); 
} 
function getdir($loc,$tfile) 
{ 
    $startloc="/path/to/root/dir"; 
    if (file_exists($startloc.$loc) && $handle = opendir($startloc.$loc)) 
    { 
     while (false !== ($file = readdir($handle))) 
     { 
      if ($file != "." && $file != ".." && strncasecmp($loc.$file,$tfile,strlen($loc.$file))==0) 
      { 
       if(strncasecmp($loc.$file,$tfile,strlen($tfile))==0) 
       { 
        return $loc.$file; 
       } 
       else 
       { 
        return getdir($loc.$file."/",$tfile); 
       } 
      } 
     } 
     closedir($handle); 
    } 
    return false; 
} 
?> 
404 Error, Page Not Found 

をあなたのウェブサイトのURLでyourdomain.comを置き換えます。検索を開始するには、/ path/to/root/dirをルートディレクトリの絶対パスに置き換えます。 404エラー、カスタム404エラーページが見つかりません。

このスクリプトでは、同じ名前で大文字と異なるページのファイルシステムを再帰的に検索し、見つかった場合はリダイレクトする必要があります。

1

上記は機能しませんが、次のようになります。 www.chassis-plans.com/off-the-shelf-industrial-pc.htmlで遊んでください。 URLの大文字と小文字のいずれかを変更すると、コードによって適切な大文字と小文字に変更され、ページが表示されます。存在しないURL(www.chassis-plans.com/x)を入力すると、カスタム404ページが表示されます。

まず、次のものを.htaccessファイルに追加します。ここで/forwarding-site-nocase.htmlはカスタム404ページのURLです。

AddType application/x-httpd-php .html .htm 
ErrorDocument 404 /forwarding-site-nocase.html 

カスタム404ページの一番上に、1行目から次の行を追加します。最初に空白行があると失敗します。

<?php 
$mydir=getdir("/",$_SERVER['REQUEST_URI']); 
if($mydir!=false) 
{ 
    $thedomain = 'http://' . $_SERVER['SERVER_NAME']; 
    header("HTTP/1.1 301 Moved Permanently"); 
    header('Location: ' . $thedomain.$mydir); 
} 
function getdir($loc,$tfile) 
{ 
    $startloc=$_SERVER['DOCUMENT_ROOT']; 
    if (file_exists($startloc.$loc) && $handle = opendir($startloc.$loc)) 
    { 
     while (false !== ($file = readdir($handle))) 
     { 
      if ($file != "." && $file != ".." && strncasecmp($loc.$file,$tfile,strlen($loc.$file))==0) 
      { 
       if(strncasecmp($loc.$file,$tfile,strlen($tfile))==0) 
      { 
       return $loc.$file; 
       } 
       else 
       { 
        return getdir($loc.$file."/",$tfile); 
       } 
      } 
     } 
    closedir($handle); 
    } 
    return false; 
} 
?> 

今、あなたは、次のようなカスタム404ページのためのあなたの標準的なHTMLでこれに従うことができます:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Language" content="en" /> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta name="description" content="Company information page - Page Not Found Error"/> 
<meta name="search" content="Company information page - About Us. Manufacturer of rack mount rugged computer systems and rugged LCD displays for the military and industrial markets" /> 

などのページの残りの部分。

私は開発とテストの際にIE、おそらくキャッシュに問題がありましたが、今はうまくいくようです。 (グーグルで翻訳)

0

再帰を行う必要がありますでしょうか?それが唯一の正しいファイル名を識別するために残って
dirname ($ _SERVER ['REQUEST_URI'])


あなたはファイルパスを知っている場合。

スクリプトの私の簡易版は次のようになります(ルートフォルダ内)

の.htaccess

<?php 

$tdir=getdir($_SERVER['REQUEST_URI']); 

if($tdir != false) { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header('Location: http://www.YOURDOMAIN.COM'.$tdir); 

} else { 
    die('YOUR PERSONAL MESSAGE FOR 404'); 

} 

function getdir($tfile) { 
    $startloc="/HOME/YOUR/PATH/TO/WWW".dirname($tfile); 

    if (file_exists($startloc) && $handle = opendir($startloc)) { 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != ".." && strcasecmp($file,basename($tfile))==0) {    
     return dirname($tfile).DIRECTORY_SEPARATOR.$file; 
     } 
    } 
    closedir($handle); 
    } 
    return false; 
} 
?> 

(ルートフォルダ内)
ErrorDocument 404 /notfound.php

notfound.php変更することを忘れないでください:
1. YOURDOMAIN.COM
2. "vhosts.conf" フォルダを使用して404
3/HOME/YOUR/PATH/TO/WWW

0

FOR YOUR個人的なメッセージ。 URLは大文字と小文字を区別することができます。場所:

RewriteEngine on 
rewritemap lowercase int:tolower 
RewriteCond $1 [A-Z] 
RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L] 
関連する問題