簡體   English   中英

mod_rewrite兩次重寫目錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM