現在のURLを書き換えたい
http://localhost/sitename/landing-page/?from=Algeria&to=Afghanistan&submit=Submit
to http://localhost/sitename/removals-from-Algeria-to-Afghanistan
この書き換えルールを書きました。
RewriteCond %{THE_REQUEST} ^GET\ /([^/]+)/landing-page/?\?(from)=([^&]+)&(to)=([^&\s]+) [NC]
RewriteRule ^ /%1/removals-%2-%3-%4-%5? [R=301,L]
RewriteRule ^removals-from-([^-]+)-to-([^-]+)$ /removalscenter/landing-page/?from=$1&to=$2&submit=Submit [L]
私のhtaccessコードは..
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /removalscenter/
RewriteRule ^index\.php$ - [L]
RewriteCond %{THE_REQUEST} ^GET\ /([^/]+)/landing-page/?\?(from)=([^&]+)&(to)=([^&\s]+) [NC]
RewriteRule ^ /%1/removals-%2-%3-%4-%5? [R=301,L]
RewriteRule ^removals-from-([^-]+)-to-([^-]+)$ /removalscenter/landing-page/?from=$1&to=$2&submit=Submit [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /removalscenter/index.php [L]
</IfModule>
# END WordPress
これでリンクが変更されます。しかし、ページが見つからないというエラーが表示されます。
この.htaccessファイルは/removalscenter
ディレクトリにあると(あなたのRewriteRule
パターンを見て)仮定していますか? (最初のいくつかのディレクティブは汎用で、<sitename>
を許可しますが、残りのディレクティブはハードコードされているように見えますか?)
RewriteBase
ディレクティブを設定することにより、RewriteRule
のフルパスを指定する必要がありません。substitutions-RewriteBase
を使用する理由です。 RewriteRule
置換を相対として保持できます(ルールを簡素化)。例えば:
RewriteRule . /removalscenter/index.php [L]
単純にすることができます:
RewriteRule . index.php [L]
http://localhost/sitename/landing-page/?from=Algeria&to=Afghanistan&submit=Submit
サンプルURLは完全なURLのようには見えません。インデックスドキュメントがありません。 index.php
。これを明示的に指定しない場合、mod_dirは「修正」する必要があり、問題を引き起こす可能性のある追加の書き換えが行われます。したがって、これは次のようになります。
http://localhost/sitename/landing-page/index.php?from=Algeria&to=Afghanistan&submit=Submit
同様に、RewriteCond
ディレクティブの末尾のスラッシュはオプションであってはなりません。
404をさらにデバッグするには、R
フラグを追加して、一時的に内部書き換えを一時(302)外部リダイレクトに変更してみてください。例えば:
RewriteRule ^removals-from-([^-]+)-to-([^-]+)$ landing-page/index.php?from=$1&to=$2&submit=Submit [L,R]
リダイレクトしますか?何にリダイレクトしますか?