.htaccess-スラッシュをアンダースコアに再帰的にマッピングする

May 05 2020

G'day、

タイトルが示すように、私はURLを次のようにフォーマットしようとし/this/is/mah/page/strucutreています:ファイルへthis_is_mah_page_structure.php

今、私はそれを機能させています-構造の深さがわからないことを除いて。したがって、再帰を実行する必要があります。

私が1つと2つの交換のために持っている作業スニピットは次のとおりです。

    # map the slashes to underscores
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]+)/?$ $1_$2 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ $1_$2_$3 [L]

私はこれを見つけました:Htaccessは、アンダースコアを、それを行う方法を示すハイフンに再帰的に置き換えます(さまざまな文字に対して)。このhttps://www.askapache.com/htaccess/rewrite-underscores-hyphens-seo-url/これは同様のコードを示しています。しかし、私はそれを機能させることはできません。

また、.htaccess再帰は、に基づいて500エラー(10ループのオーダー)を引き起こす可能性があることもわかりましたLimitInternalRecursion。それから、複数を1つのパスに置き換えようとしましたが、URLが2倍になるという予期しない結果になりました。

これは、他のStackOverflowの回答の例であり、私が何をテストしているかを示しています。アイデア/考え/方向性はありますか?

(アンダースコアをハイフンで書き換えます-したがって、それは間違った側面ですが、それは始まりです)

    RewriteEngine On

    # if there is only one underscore then repalce it by - and redirect
    RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=302]

    # if there are more than one underscores then "repeatedly" repalce it by - and set env var USCORE
    RewriteRule ^([^_]*)_([^_]*)_(.*) $1-$2-$3 [E=USCORE:1] # if USCORE env var is set then redirect RewriteCond %{ENV:REDIRECT_USCORE} =1 RewriteRule ^([^_]+)$ /$1 [L,R=302]

-編集と完全なソリューション-

したがって、この投稿を通じて、R = 302(または301)の有無が、アイデアを「URLのマップからファイル」(つまり、透過的)にシフトするものであることがようやくわかりました。「リダイレクト」に。当たり前のはずだったのですが、もっとあると思いました。

@anubhavaが示唆したように、最終的な解決策があるが、私は削除,R=301して、コメントを追加RewriteCond %{REQUEST_FILENAME} !-fし、RewriteCond %{REQUEST_FILENAME} !-dルールと同じ名前の実際のファイル/ディレクトリ間の衝突を防止します。(つまり、scripts.js、/ images / yomomma.jpgなど)

    # when there are more than one / then "recursively" replace it by _
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]+/.+)$ $1_$2 [N,DPI]

    # when there is only one / then replace it by _ and redirect
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]+)$ /$1_$2 [NE,L]

回答

2 anubhava May 06 2020 at 04:54

私は約5年前にその回答を投稿しましたが、今ではさらに改善できると思います。

次のルールをサイトルート.htaccessで使用できます。

RewriteEngine On

# if request is for a file [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
# if request is for a directory
RewriteCond %{REQUEST_FILENAME} -d
# then ignore all rules below
RewriteRule ^ - [L]

# when there are more than one / then "recursively" replace it by _
RewriteRule ^([^/]+)/([^/]+/.+)$ $1_$2 [N,DPI] # when there is only one / then replace it by _ and redirect RewriteRule ^([^/]+)/([^/]+)$ /$1_$2 [NE,L,R=301]

外部リダイレクトが必要ない場合は、最後のルールをに変更します。RewriteRule ^([^/]+)/([^/]+)$ /$1_$2 [L]