[英]mod_rewrite rewrites to directory twice?
我的索引頁和/ page之類的鏈接工作正常,但是我從/page.php中刪除php的重寫規則似乎在錯誤地寫入了url。
示例: http : //www.example.com/folder/page.php將重定向到不存在的http://www.example.com/folder/folder/page
# Remove .php extention
RewriteCond %{THE_REQUEST} \s/(.+?)\.php(?:\s|\?) [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ %1? [R=301]
# Rewrite to PHP file extension (if existing) without changing url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L]
您的問題是您將上述代碼放在此目錄http://www.example.com/folder/
中的.htaccess
文件中,因此,如果頁面中沒有.php,例如您請求http://www.example.com/folder/page
,它將為您提供結果http://www.example.com/folder/page
,不帶.php,因為它將由給定代碼的第二部分處理
# Rewrite to PHP file extension (if existing) without changing url RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\\.php -f RewriteRule ^(.+)$ $1.php [L]
這意味着當文件不帶.php時將得到相同的文件,很好。
但是當您與.php
一起編寫相同的請求時出現問題,因此該請求將為http://www.example.com/folder/page.php
,這根據您的代碼的第一部分
# Remove .php extention RewriteCond %{THE_REQUEST} \\s/(.+?)\\.php(?:\\s|\\?) [NC] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ %1? [R=301]
將立即正確刪除擴展名.php
,但問題出在代碼行中:
RewriteRule ^ %1? [R=301]
RewriteRule目標中的路徑不正確,因此您會看到兩次,因此應添加
RewriteBase /
上面的線
RewriteRule ^ %1? [R=301]
或將其替換為:
RewriteRule ^ /%1? [R=301]
它將正常工作。 `
您可以使用以下規則:
# remove .php extension
RewriteCond %{THE_REQUEST} ^GET\s(.+?)\.php[\s?/] [NC]
RewriteRule ^ %1? [R=301,L]
# Rewrite to PHP file extension (if existing) without changing url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]
在測試之前,請確保清除瀏覽器緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.