首頁>Web>source

我在使用modrewrite重定向具有多个字元串的URL時遇到麻煩。

我有一个PDF處理指令碼。

我想重定向以下內容:

https://www.example.com/pdfs/samplepdf.pdf/open [或 /download ]

https://www.example.com/pdftools/openpdf.php?file=samplepdf.pdf&task=get&dsp=open [或 dsp=download ]

在某些情况下,還会使用ID號作為查詢字元串:

https://www.example.com/pdfs/samplepdf.pdf/open?id=4334

"提取"功能還需要另外两个引數,因此:

https://www.example.com/pdfs/samplepdf.pdf/32-33/open

將重寫為:

https://www.example.com/pdftools/openpdf.php?file=samplepdf.pdf&task=extract&from=32&to=33&dsp=open

到目前為止,我想出了以下方法,這些方法不起作用:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^pdfs/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /pdftools/openpdf.php?file=$1&task=$2&dsp=$3&id=$4 [L]
RewriteRule ^pdfs/([^/]*)/([^/]*)/([^/]*)$ /pdftools/openpdf.php?file=$1&task=$2&dsp=$3 [L]
RewriteRule ^pdfs/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /pdftools/openpdf.php?file=$1&task=$2&dsp=$3&start=$4&end=$5 [L] 
最新回復
  • 5月前
    1 #

    關於您現有指令的几點註意事項:

     
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule ^pdfs/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /pdftools/openpdf.php?file=$1&task=$2&dsp=$3&id=$4 [L]
    RewriteRule ^pdfs/([^/]*)/([^/]*)/([^/]*)$ /pdftools/openpdf.php?file=$1&task=$2&dsp=$3 [L]
    RewriteRule ^pdfs/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /pdftools/openpdf.php?file=$1&task=$2&dsp=$3&start=$4&end=$5 [L]
    

    檢查請求没有對映到目錄並且不是符號鏈接的條件似乎是多餘的.但是這些條件仅適用於第一个 RewriteRule 反正指令。

    您似乎与太多的路徑段相匹配.在您發佈的示例中,似乎仅需要捕获2或3个其他路徑段.使用"提取"功能的一个有3个路徑段,其中一个包含由连字元分隔的两个數字,需要分別捕获。

    您似乎也正在捕获 task的value 来自請求的URL的URL引數,但是您已经宣告請求的URL中不存在该引數,因此必须在substitution字元串中进行硬編碼。

    您有3條規則,但似乎只需要考虑2个不同的URL. (一个用於"获取",另一个用於"提取"。)

    您正在使用 startend 在第三條規則中,大概應该是 fromto ? 尽管這些順序似乎也有誤。

    匹配輸入URL時,您應在正則表達式中尽可能具體.這樣可以避免冲突(匹配錯誤的URL)並提供一定數量的驗證.例如.如果最後一个路徑段只能是 opendownload 然後匹配该內容,而不是任何內容.同樣,如果您专門匹配从/到範圍,即. /NN-NN 那麼就可以確定您應该在重寫的URL中使用"提取"功能。


    請尝試以下類似方法:

    RewriteRule ^pdfs/([\w-]+\.pdf)/(open|download)$ pdftools/openpdf.php?file=$1&task=get&dsp=$2 [QSA,L]
    RewriteRule ^pdfs/([\w-]+\.pdf)/(\d+)-(\d+)/(open|download)$ pdftools/openpdf.php?file=$1&task=extract&from=2&to=$3&dsp=$4 [QSA,L]
    

    這假定PDF檔案(第二路徑段)的基本名稱只能包含字元 a-zA-Z0-9_ (下划線)或 - (连字元)。

    這還假定"提取"功能也可以是 opendownload (与"获取" URL相同)。

    因為 task的值 引數未出現在請求的URL中,這必须在重寫的URL中进行硬編碼,具體取決於 /NN-NN 路徑段是否存在於請求的URL中。

    QSA (附加查詢字元串)標志附加原始請求中存在的所有查詢字元串,例如. id=4334 到重寫的URL上新查詢字元串的末尾.但是請註意,這並不专門檢查 id 引數-將从初始請求中追加任何引數。

  • wordpress:在wordPress預設搜尋功能中更改ORDER By
  • drupal:fetchAll資料庫查詢返迴錯誤