4

次のような URL を処理する書き換えルールを正常に作成しました。

http://example.com/xyz

http://example.com/xyz/

http://example.com/xyz/abc

http://example.com/xyz/abc/

modの書き換えと正規表現は次のとおりです。

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L]

これはうまく機能しますが、問題は、http://example.com/xyz/abcに移動すると、スクリプトは正しい入力 (n=abc) を取得しますが、パスがめちゃくちゃになるため、コード内のすべての相対 URLルートではなく xyz に相対的であるため、壊れています。

これを回避する方法はありますか?上記のように、パスを強制的に正しくするために /index.php にリダイレクトしようとしました。正規表現とコードで長い 1 日を過ごした後、私の脳は焼き尽くされています。

4

5 に答える 5

8

HTMLbase要素を使用して、すべての相対URLがブラウザに表示されるパスとは異なるパスを使用するように強制します。

<base href="http://www.example.com/"/>
...
<a href="relative/url">link</a>

相対URLは、ブラウザが「http://www.example.com/xyz/」ページを見ていると判断した場合でも、ベースとして「http://www.example.com」使用します。したがって、リンクは「http://www.example.com/xyz/relative/url」ではなく「 http://www.example.com/relative/url」に移動します。

そして、それを行うスタックオーバーフローの方法があります。この方法では、すべてのURLが絶対パス(画像などのリソースへのパス)またはルートを含むパス(つまり「/ feeds / questions / 123」)のいずれかであり、相対パスの問題を回避します。

于 2009-11-18T13:11:19.307 に答える
7

3 つのオプションは次のとおりです。

1) base タグを使用します (これは、リンク、画像、スクリプト、スタイルシートなどを含む、ページ上のすべての相対 URI に影響します)

<base href="http://yoursite/">

2) すべてのリンクを完全修飾 URI に変更します

<a href="http://yoursite/yourpage.html">

3) 「/」プレフィックスを使用して、パスが各 URI のルートに対して相対的であることを示します。

<a href="/yourpage.html">

私は個人的に base-tag オプションを最もよく使用しましたが、これには (よく理解せずに使用した人から) 悪い評判が寄せられています。mod_rewrite に関して言えば、すべての画像、CSS、スクリプト、およびリンクを含むすべてのパスをルートからの相対パスにしたいので、base タグは完璧です。

于 2009-11-18T13:44:38.600 に答える
2

編集:壊れている画像やスタイルシートなど、HTMLコード内のURLについて話していると思います。

いいえ、私が知る限り、ブラウザはパスを認識し、それに関連するリソースを要求するため、それを回避する方法はありません。サーバーとは何の関係もなく、あなたにできることは何もありません。

ディレクトリスプリッターとして解釈されない別のスプリッター(アンダースコアなど)を使用するか、絶対パスを使用するか、<base>タグを使用する必要があります。ただし、私自身はベースタグを使用したことがないので、どこを見てもあまり評価されていません。おそらく最良の方法は、絶対パスに切り替えることです。

于 2009-11-18T13:10:00.283 に答える
1

パスを含めるように最後のRewriteRuleを変更します。正規表現にパスがあります。

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ $1/index.php?n=$2 [L]

または代わりに(あなたが達成しようとしていることに応じて):

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1/$2 [L]
于 2009-11-18T13:10:03.227 に答える
1

すべての URL を変更する代わりに、自分のページの BASE 要素をショートカットとして使用してみました。次のように基本要素を追加します。

<base href="/">

結果は次のとおりです。

This:    <link type="text/css" rel="stylesheet" href="my.css">
Becomes: <link type="text/css" rel="stylesheet" href="/my.css">

This:    <script type="text/javascript" language="javascript" src="include/my.js"></script>
Becomes: <script type="text/javascript" language="javascript" src="/include/my.js"></script>

This:    <a href="foo.html">
Becomes: <a href="/foo.html">

This:    <a href="foo/bar.html">
Becomes: <a href="/foo/bar.html">

必要に応じて、ベース タグをいつでもオーバーライドできます。

This:    <a href="/foo">
Remains: <a href="/foo">

This:    <a href="/foo/bar/">
Remains: <a href="/foo/bar/">
于 2009-11-18T13:32:05.303 に答える