2016-04-16 16 views
2

フォルダ内に既に存在するファイルのルールを別の場所を指すようにするにはどうすればよいですか?たとえば、wp-content/uploads/フォルダ内のpdfファイルへの任意の要求をページdownload/?q=$1に書き換えるためです。フォルダ内に存在するpdfファイルのルールを書き込む方法

私は、次の

# checks that the request is for a file that *does not* exist 
RewriteCond %{REQUEST_FILENAME} !-f 
# make sure we've not already redirected to the uploads directory 
# (in case it doesn't exist in there either) 
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/ 
# the rule matches against either pdf, zip or xls. 
RewriteRule ([^/]*\.(pdf|zip|xls))$ /wp-content/uploads/$1 [NC,L,R=301] 

とSO related question for moved pdf filesで見てきた。しかし、私は逆の効果をしたいです。既存のファイルのリダイレクトを作成し、存在しないファイルに対して404が見つからないようにしてください。

私は運がない別のアプローチを試みました。 WordPressのデフォルトの.htaccessファイルがルートフォルダ内にある場合は、これを妨害することがあります。 pdfのすべてのリクエストをカスタムページに書き換えるには?

EDIT:

.htaccessファイルはwp-content/uploadsフォルダにあります。

WordPressのは、私はすでにカスタムプラグインで、以下の機能を持っているAPI書き換えについて:私の理解から

function add_rewrite_rules($aRules) { 
    $new_rules = array(
    'exams/([^/]+)/([^/]+)/?$' => 'index.php?pagename=exams&type=$matches[1]&city=$matches[2]', 
    'exams/([^/]+)/([^/]+)/subject/([^/]+)/?$' => 'index.php?pagename=exams&type=$matches[1]&city=$matches[2]&subject=$matches[3]' 
     ); 

    return $aRules + $new_rules; 
} 

を、これらの機能はRewrite API/add rewrite rule文書で説明したように、私たちはWordPressのための追加の書き換えルールを指定することができます。したがって、.htaccessファイルで指定されたルールの内容には影響しないはずです。

+0

...ルート.htaccessにルールを移動することです。あなたのメイン '.htaccess'ファイルでこれを試してください:' RewriteRule ^。* \ .pdf $/wp-content/download/[R = 301、L] '。拡張子が.pdfのファイルに対して動作します。 (RewriteRule ^(。*)//wp-content/download/[R、L] 'ともに – LoicTheAztec

+0

の前に' RewriteEngine On'で@LoicTheAztec 。あなたはまったく正しい。私は問題を幾分不満足にさらしながら質問をしようとしたが、私は目標が何かを忘れてしまった。私は質問を書き換えます。 – pQB

+0

あなたのWPのインストールにはいくつかのプラグインがインストールされている可能性があり、そのために.htaccessルールをスキップし、キャッシュからファイルを提供することがあります。 – anubhava

答えて

4

あなたのWPは、ドメインのルートにインストールされていると仮定すると、それはなるだろう:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI} /wp-content/uploads/ 
RewriteRule ([^\/]+\.pdf)$ /download.php?q=$1 [NC,L,R=301] 

(あなたの例のコードから!を削除する)最初の行は、既存のファイルにマッチするので、PDFファイルが存在しない場合は、標準の404

を得るでしょう第二の条件は、既存の一致を制限ファイルが/wp-content/uploads/フォルダにあるため、http://example.com/example.pdfはリダイレクトされません。

最後に、(2つの先例条件によって影響を受ける)RewriteRuleqパラメータとしてファイル名を渡す/downloads.phpするフォルダ.pdf拡張子で終わるあなたのアップロード上の既存のファイルをリダイレクトします。

したがってhttp://example.com/wp-content/uploads/2016/04/filename.pdfは、フォルダにfilename.pdfが存在する場合はhttp://example.com/download.php?q=filename.pdfにリダイレクトされます。

私はこのソリューションをローカルのダミーWPインストールでチェックしています。これがうまくいくので、これが役立ちます。


編集:あなたはこれだけで、あなたのアップロードフォルダ内の.htaccessをお持ちの場合は十分なはずです:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ([^\/]+\.pdf)$ /download.php?q=$1 [NC,L,R=301] 

あなたは、いくつかのゴミを入れて(コメントに示唆されているものみました.htaccessが有効になっているかどうかを確認する)

別の撮影はあなたの質問は非常に明確ではありません親切

+0

提案したルールは理解していますが、うまくいきません。しかし、最初のファイルを '!-f'に変更すると、_file.pdf_が存在しないにもかかわらず期待される動作ではない場合、'/download.php/q = file.pdf'にリダイレクトされます。だから、私はそれがホスティング側でいくつかの他の動作に関連する可能性があるのだろうか? – pQB

+0

さて、Wordpressは独自の[Rewrite API](https://codex.wordpress.org/Rewrite_API)を持っていますが、まずいくつかのテストを行ってみましょう。* RewriteCond行を両方とも削除してください。 pdfのURLがリダイレクトされます。また、私の答えはあなたのURLがクエリ文字列データを含んでいないと仮定しています... –

+0

2番目の提案が働いています。 _Redirection_プラグインがインストールされていて、_rewrite_rules_array_というフィルタを追加して独自のルールを書き直しています。私はそれがいくつかのキャッシュの問題に関連する可能性があるのだろうかと思います。 NC、L、Rの意味と結果を説明していただければ幸いです。 – pQB

1

あなたは/wp-content/uploads/.htaccessの最初のルールとして、以下を使用できます。

RewriteEngine on 

RewriteRule ^([^.]+\.pdf)$ /download/?q=$1 [NC,L] 

これは内部/ /wp-content/uploads/foo.pdfをリダイレクトしますダウンロード/?q = foo.pdf。あなたが外部にリダイレクトしたい場合は

/wp-content/uploads/foo.pdf /download/?q=foo.pdf(古い場所から新しい場所にURLバーの変更)完全なURLを使用へ書き換え対象例えばhttp://example.com/download/?q=foo.pdfまたはRリダイレクトフラグを追加[NC、L、R]

+0

これは動作しません(2つのオプションのどちらも)。私はこのトピックで何かを誤解しているのだろうかと思います。 'http:// www.example.com/wp-content/uploads/foo.pdf'にアクセスすると、pdfファイルが表示され、リダイレクトは行われません。 '.htaccess'ファイルは' wp-content/uploads'に置かれていますが、サイトのルートにWordPressに同梱されているデフォルトの '.htaccess'にルールを置いてもうまくいきません。 – pQB

+0

@PQbルールを更新しました。これを**/wp-contents/upload/.htaccess **で使用できるようになりました。 – starkeen

+0

私は運がなかった。それは動作しません。 – pQB

関連する問題