ANDで末尾のスラッシュなしで動作する場所をnginxで作成するにはどうすればよいですか?


46

今、私はこの設定を持っています:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

ただし、www.mysite.com/phpmyadmin(スラッシュがないことに注意して)アクセスすると、404を探しているものが見つかりません。末尾のスラッシュが含まれていないためだと思います。どうすれば修正できますか?


2
私はこの質問がかなり古いことを知っていますが、受け入れられた答えを変える必要性を強調したいと思います。未経験のユーザー(この種のQAを検索するユーザー)は、現在受け入れられている回答を使用してセキュリティホールを作成する可能性があります。
ボジー

回答:


34

使用している正規表現に含まれている可能性があります-

location ~ ^/phpmyadmin/(.*)$

上記は/ phpmyadmin /、/ phpmyadmin / anything / else / hereに一致しますが、正規表現には末尾のスラッシュが含まれるため、/ phpmyadminには一致しません。

おそらく次のようなものが必要です:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

疑問符は正規表現の量指定子であり、nginxに前の文字(スラッシュ)の0または1つに一致するように指示する必要があります。

警告:コミュニティは、このソリューションを現状のセキュリティリスクと考えています


ありがとうございました!そして、説明もありがとう。将来的に重宝します。
ロブ

15
パターンはまったく正しくありません。また、「/ phpmyadmin1234」のようなパスに一致することもありますが、明らかにそれはあなたが望むものではありません。@kbecのソリューションは正しいものです。
ニャー

3
これを明示的にダウン票したことは申し訳ありませんが、@ Meowコメントは無視することが重要です。これは、セキュリティホールを含む可能性のあるWebサーバーの設定ミスにつながる可能性があります。
ダニエルF

34

より良い解決策:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

サーバーに/home/phpmyadmin最初のアクセス許可があることを確認してください。


受け入れられた答えとの違いの説明:

それはすべて正規表現についてです。

まず、^charは、文字列の先頭ではなく、途中のどこからでも一致させたいことを意味します。$文字列の末尾にマッチする最後の手段で。

これ(?:)は、非キャプチャグループを意味します。キャプチャ結果には含まれませんが、いくつかの文字を単純にグループ化します。/charは親パスの重要な部分ではなく、子パスの重要でない部分にしたいので、このようにグループ化します。


なぜそれが良いのですか?
ミーコヒ

2
@Meowは受け入れられた答えでこれに答えました
-kbec

2
これは受け入れられる答えである必要があります
ヨントリモロー18

@Meekohi説明を書いた
-kbec

8

なぜあなたはただ使用しないのですか

location /phpmyadmin {
    alias /home/phpmyadmin;
}


それは私のために働いていなかったからです。こちらをご覧ください:serverfault.com/questions/375602/…–
ロブ

1
@Rob aliasディレクティブの末尾のスラッシュなしで試してみましたか?
シェーンマッデン

これは実際には正しい答えであり、正しい方法です。単に末尾のスラッシュを除外すると、末尾のスラッシュの有無に関係なく入力されたURLに対して機能します。Nginxで何かを複雑にする必要はないので、シンプルで複雑な正規表現やその他の面白いことがNginxの速度を低下させるだけです。
ミッチェル

4
これに伴う問題は、それはまた、上で一致することである/phpmyadminblahblahblahblahか、他の組み合わせ
ゲイリー・グリーン

6

これは古い質問ですが、Google経由でここにたどり着く人にとっては、次の方法で解決しました(@kbecのバリエーション、かなり良かったです):

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args
}

これにより/foo、さまざまなバリエーションがキャプチャされ/bar、別のURL(パラメーターを含む)にリダイレクトされます。私はproxy_passディレクティブでそれを示していますが、それも動作しaliasます。

  • /foo -> /bar
  • /foo/ -> /bar/
  • /foo/sub -> /bar/sub
  • /foo/sub1/sub2/?param=value -> /bar/sub1/sub2/?param=value

$1オプションでサブリソースと先頭のスラッシュをキャプチャするため、動作し/fooextra/ます。また、現在または最後のスラッシュを適切にリダイレクトします。


1
proxy_passを使用したい、したがって引数に注意を払うという典型的なケースを検討してくれてありがとう。あなたは私の賛成票を持っています。
ダニエルF

2

このリダイレクトは、末尾のスラッシュの有無にかかわらずURL のみを書き換えます。スラッシュの後に来るものはすべて上書きされません。

domain.com/location => domain.com/new/locationにリダイレクトされるdomain.com/location
=> domain.com/new/locationにリダイレクトされるdomain.com/location/other =>リダイレクトされ
ない

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}


0

私はそのようにしました

rewrite ^/promo/?$     http://example.com/promo/page43902.html;
location /promo/ {
    root /var/www;
}

0

単純に2つの書き換えを行わないのはなぜですか。

location ~ ^/phpmyadmin
{
    rewrite /phpmyadmin /home/phpmyadmin/ break;
    rewrite /phpmyadmin/(.*) /home/phpmyadmin/$1 break;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.